{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "import folium\n",
    "import queue\n",
    "import numpy as np\n",
    "import osmnx as ox\n",
    "import matplotlib.pyplot as plt\n",
    "from geopy.geocoders import Nominatim\n",
    "from geopy.distance import geodesic"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcwAAAF/CAYAAADEhfldAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAADNCElEQVR4nOydd1hUZ/r+7xlm6L13FOl1zhlEYy+APZYYNVmjUZMY3Y2btrupu9lNYvpuejT2HnvFAgpiiQU5Z+gMvYkUQXovvz/8nfMFBBmYMwVzPteVK0o5551xZp73fcp9C7q6usDDw8PDw8PzeISaXgAPDw8PD89wgA+YPDw8PDw8CsAHTB4eHh4eHgXgAyYPDw8PD48C8AGTh4eHh4dHAUSP+6alpSXfQsvDw8PD84eiqqpK0NfX+RMmDw8PDw+PAvABk4eHh4eHRwH4gMnDw8PDw6MAfMDk4eHh4eFRAD5g8vDw8PDwKAAfMHl4eHh4eBTgsWMlPDw8PDyPYmNjA09PT4wYMQJOTk4wNDREXV0d0tPTcfPmTTx48EDTS+RRAYLHuZXwc5g8PDx/NObOnYuwsDBcuXIFx44dAwDo6+vDw8MDnp6e8PLygkAgQFZWFnJycnD37l00NDTA3NwcQUFBGD16NG7dugVdXV2kp6cjJydHw4+IZ7D0N4fJB0weHh6e/8/o0aNx7tw5CIUPq1X//ve/0dLSAnt7exQUFCAzMxOZmZmoqKjo9xojR47EpUuXYG5ujubmZsyfPx/x8fHqegg8HNBfwORTsjw8PDwATE1NsWDBAjZYAoCbmxt+/vln5Ofno729XaHrTJkyBebm5gAenkxnzpzJB8wnBD5g8vDw/CERi8UYOXIkvLy84OfnB1NTU4jFYpSXl8PW1hZFRUX48ssvUVpaOuC1HBwcEB4eDk9PT5iamqK5uRn6+voAgNu3b6v6oSjEokWL8I9//AP37t3DunXrcO/ePU0vadjBp2R5eHj+MNjZ2cHLywuenp5wc3NDdXU19PT0IBAIEBMTgzt37kBPTw8eHh7Izc1FfX19v9cyNDREWFgYgoKCYGRkhMrKSty4cQM3btyAl5cXli5dCjs7O6xfv16Nj7BvTExMkJWVBV1dXQDAwYMHsW7dOg2vSnvhU7I8PDx/OAwNDeHh4cEGyfb2duTm5qK2thYNDQ1oaWlBdHQ0UlNTwRweGhsbkZSU1Of1hEIhxo4di6eeegrW1tbsz0ZHR6OxsZH9uYyMDPz73//GG2+8AVdXVxQWFqrl8fZGIBBg5MiRmDhxIkSi//u419PT08h6hjv8CZOHh+eJwtbWFv7+/vD19YWtrS3y8vKQmZmJmpoa+Pr6IiAgAOnp6bhx4waKiooUuqanpyemTZsGV1dXdHZ2Ijs7G1FRUQOmNZl65okTJzh4ZIpjZWUFgiBAkiRaWlpw584dBAcH46233kJJSQlWrlyJ3Nxcta5pOMF3yfLw8DyRCAQCuLm5sUFSJBIhNTUVaWlpuHfvHvz8/BAaGgoTExPcvHkTd+7cQUNDw4DXtbCwwIwZM+Dr6wuxWIySkhLExcUhOTlZ4bWZmZlhw4YN2LhxIzo6OpR5mANiYGCAoKAgkCQJS0tLJCYmgqIolJSUqPS+TyJ8SpaHh2dYIhaL4erqiuLiYrS0tLBf8/T0hJ+fH3x8fFBbW4u0tDTs378f9+7dw6hRoxASEgIfHx/k5uYiNjYWGRkZeNwBAQB0dXUxdepUkCQJU1NTVFdX48qVK4iLi1O4S7Y7NTU1KC0tha+vL1JSUob0+B+Hjo4OvL29QRAEPD09IZfLERMTg6ysLHR2dnJ+vz86/AmTh4dHazE2NsaZM2cQFBSEgoIC/P3vf4e9vT1GjRqFu3fvIjU1Fenp6Xjw4AFsbGwglUpBEATq6upAURRkMlmP2mJ/kCSJiRMnwt7eHs3NzUhNTUVUVBRqa2uVfgxSqRR+fn7Ys2eP0tdicHFxAUmSCAwMREVFBWiaRlJSEpqbmzm7xx8ZPiXLw8Mz7Fi6dCl++eUX9u/Hjh3Djz/+CLlcjqamJhgaGiIoKAhSqRRmZmagaRoJCQkoLy8f8NouLi4IDw+Hu7s7BAIB8vLycPHiReTn53P6GHR1dfHuu+/iq6++Uih494eFhQUIggBBEAAAmqZB0zQvw6cC+JQsDw/PsEAoFLJpxgkTJqCzs5MVEzh69CiSkpLg4+MDkiQxatQoyOVyREVFIScnZ8A0pLGxMSIiIhAYGAh9fX2Ul5fj5MmTKhUWaG1thVwuR1BQEG7evDmo39XX10dgYCBIkoSNjQ2Sk5Nx6NAhhZuVeLiFP2Hy8PBoBc7OziAIAsHBwWyaMTk5GbNmzcLs2bORmpqK7Oxs9vsURSEpKYmta/aHUCjEpEmTEBoaCgsLCzZdGxMTg9bWVrU8Ni8vL4SFheHnn38e8GeFQiG8vLxAkiS8vLyQnZ0NiqIgl8tV3jjE8xD+hMnDw6N1mJmZseMPQqEQNE3j559/RlVVFYCHA/cVFRVISUmBrq4umpqaenz/cQQEBGDy5MlwcnJCW1sb5HI5duzY8VgdWFWRnZ2NxYsXw9raGvfv3+/zZ5ycnECSJIKDg3H//n3QNI3jx4+jqalJzavl6Q/+hMnDw6NW9PT0EBAQAJIkYW9vj+TkZFAUxQ73i0Qi+Pn5gSRJuLm5ISUlBRRFIT8/f8AuV2dnZ4SFhWHUqFEQCoUoLi5GTEwM5HK5Oh7aY5kzZw4sLCxw5swZVFdXA3i4YZBIJCBJEiKRiK1LVlZWanaxf3D4ph8eHh6NIRQK4eHhAYIg2FEPiqKQkZGBjo4OVpGGIAj4+/ujuLgYFEUhNTUVbW1tj722ubk5wsLC4O/vz9Ylb926hZs3b2rVaMXmzZvx7LPPoqmpCf/6178AAI6OjuyGoaCgQMMr5GHgAyYPD4/acXBwYNOM1dXVbN2R6Ra1t7dn65YNDQ2QyWRITExEbW0trKysEBwcDDc3N4jFYggEAsyYMQO1tbX45z//CV9fX3Zesra2FjRNq7UuORjs7e2RlpbG/j0tLQ3r1q1Denr6kOY7eVQLX8Pk4eFRCyYmJmyaUV9fHzRN49dff2Vrd2ZmZpg8eTIkEgn09fUhk8mwfft2lJeXQ19fn1WrsbKyQlJSEm7evIm2tjacP38elpaWAIDg4GCcOHECaWlpuHjxolaOVggEAowaNQokSSIgIAD19fUwNjYGAFy9enVQikE82gF/wuTh4VEasVgMf39/kCQJZ2dnpKam9qg76uvrIyAgAARBwN7eHikpKZDJZMjPz4dAIICnpyfbFZqVlQWKopCZmYnOzk6MHDkS4eHh+OSTT1gB8ZSUFEyaNEnDj7pv7Ozs2HnJuro60DSNxMREjBgxAn/961/h5uaGxYsXcyKKoA0wXb2lpaVsbXa4w6dkeXh4OEUgEMDd3R0kScLPzw8FBQWgKArp6eloa2t7RLYtOzsbNE2zdUs7OztIpVJIJBJUV1cjISEBSUlJaGpqgqmpKWbMmAF/f3/o6uqitLQUlpaW+POf/4yOjg4sX74cFy9e1PRTwGJsbAyJRAKCIGBsbAyapkFRVJ8CCqtWrWIf63BHKBTi4MGDmD59OmpqarBo0SLQNK3pZSkNHzB5eHg4wdrampWga2xsZCXo6uvrWSF0giAQEBCAsrIy0DSNlJQUNDU1wcjICBKJBFKpFIaGhqAoChRF4f79+xCJRJg0aRJGjx4Nc3Nz1NbWgqIoxMbGsnVJPT09vPjii7h+/bpKtFkHQ+9u3rS0NFAUhdzc3Md280okEgQHB2PXrl1qXK1qIEmyx8Zl165deOONNzS4Im7ga5g8PDxDRiwWIzAwEKGhobCysgJN09ixYwfKysoAADY2Nhg3bhwIgkBraysoisIPP/yA6upq6OjosA06I0eORHp6OiIjI9nA4ufnh6VLl7LzkhkZGdi6dWufoxWMVRVJkhoJmAKBACNGjABJkj26efft2zdgNy9DWloa5s+fD0NDQ6Wk8jSFUCiEp6cnW6duaWlh/TWfdMsw/oTJw8PTLyYmJhg/fjxGjx6NoqIi3L59GxkZGejs7GR1XEmShLm5OWsnxXhEMgLhQUFBKC0tBUVRSE5ORmtrK+zs7BAeHg5vb2/o6OigqKhI4XlJrrRZB4O1tTVIkgRBEGhubmZP1XV1dUO63rJly5CXl4dbt25xvFLV4eLiAoIgEBQUhMrKSlaJKSAgAK+88grMzc2xZMmSJ0KNiE/J8vDwKIy1tTUmTpyIwMBAyGQyXL16FQ8ePIBAIICHhwdCQ0Ph4eEBuVwOiqKQnZ2Nzs5OmJqagiRJVrmHoihWIFxfXx/Tp0+HRCKBsbExqqqqcPPmTVy/fn3Q85LLli1Dfn7+oLVZB4OhoSGCg4NBEATMzc0hk8lA0/SAptGK4Ovri0mTJmHz5s0crFR1WFtbs2M/nZ2dkMlkkMlkfSotvf766zhx4gTn4vWagE/J8vDwDIibmxsmT54MV1dX3Lx5E9988w0aGhpgZGSEqVOnYvTo0WhsbER8fDyOHDmClpYWiMVi1jHEyckJycnJOHLkCKvcM3r0aEyYMAG2trZoampCcnIyoqOjUV9fP+R1UhSFsLAwzgNm7/RxRkYGoqOjFRJ2HwyZmZlYvHgxzM3Nta6z1MTEBMHBwZBIJDA1NUViYiIOHDiAu3fvPvb3aJoGQRBPRMDsD/6EycPDA29vb0ydOhXGxsa4evUqKIpCW1sbLC0tMXXqVAQEBCA5ORm3bt3C3bt3WWUeppbHdMimpaWhvb0drq6uCA8Px8iRIwE8rG1FR0dz5rIhFArx7rvvYvPmzf1qsw4GplEpMDAQ9+7dY9ONqhRBWLBgAR48eIC4uDiV3UNR9PT04O/vD4lEAhcXF6SlpYGmaeTk5AwoR8hgZmaGDRs2YOPGjcM+LcunZHl4eHogEAjg7++PKVOmQCQSISYmBsnJyejq6oKpqSmmT5+OgIAA3LhxA7///jsaGxvZFB1Jkmwtj6Zpdii/u3VWWVkZrl27hjt37qhk/XPmzEFrayuio6OH9PuWlpYgSRISiQQdHR2sjmtNTQ3HK+2bkSNH4umnn8Z3332nlvv1RkdHB15eXpBIJPD29kZubi5omlZKfejll1/G77//jtTUVI5Xq174lCwPDw+Ah6ezoKAgTJ06Fa2trYiJiUF6ejq6urqgp6eHKVOmIDQ0FPHx8fjmm2/Q1dXFNvdYWlpCJpNh9+7duHfvHoRCISZOnIjQ0FBYWlqivr4et27dUotEHU3T7DymoqcgAwMD1l/S2tpa4XSjKsjPz4e+vj7s7e1RWlqqtvs6OzuzzVgVFRWQyWQ4efIkJw1UTFp2uAfM/uADJg/PHwSRSASpVIpJkyahpqYGZ86cQVZWFoCHp82QkBBEREQgMzMTP/zwAxwcHLBw4UJ4eHggMzMTMTExyMrKQmdnJ7y9vbFw4UI4Ozujvb0dcrkcO3fuVKt1VklJCVpbWzFixAjk5eX1+3OMgAJJkuxjuXz5MqskpCm6urogk8lAEATOnTun0nv1tlGjKAo//fQT55KCycnJmDNnDgwMDJ5IWzI+JcvD84RjZWWF0aNHQyqVori4GLGxsWxDjlAoRHBwMKZMmYKmpibcvHkTLi4uPUyak5OT0dzcDCsrK8yYMQM+Pj4QiUQoLi7G5cuXe4iKq5vJkyfD2toaR48efeR7vU9S3R+LtmBra4s1a9bg888/V/iUrCi6urqsHGF3VxTm315VPPfcc8jJycHt27dVeh9VwtcweXj+QDAfllKpFLa2tqAoCvHx8WyDjFgsRkhICCZOnIjGxkZUVlbCyckJAoGAlXWrqqqCrq4upk2bBpIkYWJiggcPHuD27du4cuWKVlhnWVlZYd++fcjLy8NPP/2E4uJi9iTFPBaaphUynNYUf/nLX3D+/HlkZ2crfa3ecoX5+fmsXKG6XFF8fX0xefJkbNq0SS33UwV8wOThecJhOlelUin7YZmXl4eOjg7IZDI0NDTAwsICY8aMwZgxY9DY2AixWIzW1lY0NTXB0NAQx44dQ05ODkiSxMSJE2Fvb4/m5makpqYiKipK6wTDP/74Y/z5z38GANTX12P79u1swOeqI1fVjB8/Ho6Ojjh8+PCQr2FjY8MKK/SWK1Q3QqEQ7733nkpSvuqCD5g8PE8oVlZWrFhAc3MzEhISIJPJ4OLigsjISJibm6OwsBC//fYbTExM0NXVhZKSEqSmpkIul8Pd3R0nT56Ejo4OmpqacPjwYTQ0NCA/Px/R0dFaOVfHnKS2bNkCiUTCft3f358TYQF1YmxsjLfeegsbN25UWF4PwCNKSzKZDBRFqbWBqD+efvpp1NfXIyYmRtNLGRJ8lywPzxNEb9/IxMREtnOVYfny5TA3NwcAuLq6wsrKCrt27UJmZibbwWpsbIyXXnoJOjo6AB52kebl5Wls1GEgultn1dfX4+jRo/D29oaBgQFOnjw57IIl8PBkXFhYCH9/f8hkssf+bO8GpoyMDFy8eJFVWtIWaJrGkiVLhm3A7A8+YPLwDBMYQ+KQkBD4+PggKysLcXFxkMvl7IelqakpK4rt4ODA/m5zczN++ukn5OfnQyQSYdq0aawrSGNjI9ra2iAWi1FVVYXffvtNUw+xTxjlGZIkYWhoCJlMhm3btrHWWQcOHMDcuXP7FGsfLlAUBZIk+w2YTk5OIEmyRzPW4cOH0dLSot6FKkhRUREEAgGcnZ1RXFys6eVwBp+S5eHRciwsLCCVSiGVSllZusTERLZtv3s3pJOTUw/z5kWLFoEkSZw6dQrNzc2YNGkSHBwc0NbWBrlcjujoaFRUVMDX1xeLFy9GaWkptmzZouFH/H+G1ARBwNXVFampqaBpul/rLBsbG7z88sv47LPPOO82VQdisRjffvstbt68iTNnzuDBgwcwNTVlG5hEIhErEqHNDUzdmT59OgwNDXH69GlNL2XQ8DVMHp5hhEgkgr+/P0JCQuDo6IjExETcuXMHJSUlAB42VowaNQokScLHx6ffbkhnZ2eEh4dj1KhREAgEKCwsZOcpe2NiYoI33ngDGzduVFtHZXeYEzRBEKwhNU3TSEtLU6i299prr7G2YcONGTNmYN++fRAKhSguLsbPP/8MW1tbdhSkoKBA00scNJaWlli3bh0+++wzrUoXKwJfw+Th0XKYLleCIFivxfj4eFafFQAcHBzY1FxNTQ1omsaZM2fQ0NDAXsfU1BTh4eEICAiAvr4+KioqcObMGdy+ffuxH1x1dXW4d+8evLy81DpbaWdnx0rU1dXVgaZpnDt3btAdnjKZDBKJZNgFTLFYjOeeew5CoRDAw01ORUUFtm7dqpGNC1dUVVWhqqoKnp6eCtm2DQf4gMnDo2FsbW3ZgNHY2AiaphEdHc2OcHSvS+rp6YGmaWzZsqWHqo5IJMLkyZMREhICc3Nz1NfXIz4+HjExMYMa1E9KSkJQUJDKA6aJiQkkEgkIgoChoSFomu5RlxwKSUlJ2LBhA06ePDksxL9HjBiBkJAQ+Pv79xjXKS0tRVRU1LAOlgyMVB4fMHl4eIZM94BhZGQEmqaxY8cOlJWVAXhYl2Tm6pi65MmTJ5Gfn9+jRieRSDBx4kS2LpmRkYGtW7cOuQEmJSUFM2fOhFgsHtSIgyIwdUmSJOHi4oLU1FScOXMGeXl5nNQda2pqUFZWBm9vb42qDz0OMzMzSKVSkCSJjo4O3LlzB+fPn0d9fT1OnDiBefPmgaKoIRtTaxtJSUmYOXMm9PT0tLZBaTDwAZOHR00wzTmMhVJqaipbc+vq6oJAIICnp2ePumR8fDx27drV47Th4uKC8PBwuLu7QyAQoKCgANu2bUNOTo7Sa2xoaEBRURF8fHyQnJys9PWYuiRJkvD19UVBQQESEhKwZ88ezgMy8DAtGxwcrFUBs3c9OikpCb/99tsj3aOMW8zLL78MgUAwLJuXesMIum/ZsgUnTpzAsWPHNLwi5eADJg+PChEKhfDw8GCDYF5eHuLj47F79+5B1yUjIiLg7+8PfX19lJeX4/Tp07h16xbna2bSssoETHt7exAE0aMuefbsWZUrz6SkpGD27NnQ1dVVuVvKQLi6ukIqlSIwMBBFRUWP1KP7oqKiArW1tRg1ahQnUnmaxtfXF+vXr4dIJMLcuXNRX1+PqKgoTS9ryPABk4dHBTg7O4MgCAQFBaGqqgo0TeP06dNsEGTqkgRBQF9fv9+65JQpUxASEgIzMzPU1dWpxTorNTUVc+fOHXTQYdLMJEnCwMCAk7rkYGlsbEReXh78/f1B07Ta7stgaWnJCit0dnaCoih8++23g5IUZBxMhnvANDQ0xOzZsyES/V+Y8fX15QMmDw/Pw3lJ5lQlFAohk8mwadMmtp7YvS7p7OyMlJQUnD59+pEaHkmSmDBhAuzt7dHa2oqMjAxER0erbTC/qakJeXl58PPzG1B5RldXl52XZNLMfT0mdULTNEJCQtQWMHt7bPaXclWUxMRETJ8+XSV1ZFWjo6MDX19fkCQJd3d3FBQUoKCgAG5ubqipqcGpU6c0vUSl4AMmD48SGBgYICgoCARBwNraGsnJyTh8+DAr/M3UJQmCgK+vb791SVdXV4SHh2PkyJGc1yWHQmpqKnx8fPoMmAKBAB4eHuxjKigowJ07d1RWlxws6enpWLhwIUxMTFTWPMNI1BEEAU9PT2RmZj6iujRU6urqUFRUBF9fXyQlJXG0YtXi5uYGkiQREBCA0tJSUBSFgwcPoqWlBYcOHcKECRPw1FNPaaUu8WDgAyYPzyBhdtEEQWDUqFGQy+WIi4tDZmYmO87g4ODAnjaZumRkZGSPuqS5uTnCw8Ph5+fH1iVPnTqlFT6CxcXFmDhxYo+vdX9MtbW1aqtLDpa2tjakpqYiODgY165d4/TaLi4uIEkSgYGBrETd0aNHOffYZNKy2hwwrays2PRze3s7aJrG999/j5qamh4/19DQgAsXLsDb23tAs29thw+YPDwKwnxYBgUFoaysDBRF4dChQ2y7vImJCfsBwtTw+qpLTp06FVKpFGZmZqitrcXNmzcRGxur8SYVBldXV/z2228YMWIEAODWrVsYPXo09PX1IZPJHnlM2ghN05gzZw4nAZNJtRMEwV5b1dZVKSkpePrpp2FoaMh2mmoDTEaFJElYWloiKSkJ+/fvx927dwf8XZqmQZIkHzB5eJ5UzM3NWT1P4KFI9g8//IDq6moAD2t4zIeps7MzW8OzsrJCWFgYWltbERsbi5CQEIwfPx52dnZobW1Feno6oqKitNIv8N1334WPjw8A4MMPP8Q777yDM2fO9Kvjqo3k5ubCyMgIdnZ27GzrYNDX12frkjY2NkhOTsahQ4fU5rHJ1K6DgoJw8+ZNtdyzP3R0dODj4wOCIODh4QG5XI7Y2FhkZmYOKv0sk8nwxhtv4OTJk8NWlIEPmDw8vdDV1WU/LO3t7ZGUlNTjw5Kp4XWfLbxz5w47KuLl5YWTJ09CX18fnZ2dOHXqFO7du4f8/Hxs2bJFa3fYrq6urI4rQ3t7O44dO4b79+9rcGWDp6uri1WZOX/+vEK/IxQK2bqkl5cXsrKycPXqVcjlco0oB9E0jWnTpmksYDKvh+4ZFWUcUurq6lBSUgIfHx+kpKRwvFr1wAdMHh7834C9VCqFr68vcnNzcePGDaSnp7Mfln1pnvau4Zmbm2PNmjXQ19cH8PBDuLy8HO+//75GHtdAdB+DYILMmjVrsHHjRgQGBmLPnj3DLlgy0DSNVatW4cKFC489GTMjQMHBwbh//z4oisLx48dZNxhNkZWVhcWLF8PKykptHdK9Xw8UReHHH3/kLBNC0zRWrFiBM2fO4MqVK5xcU53wbiU8f2gYHVeCIFBXVweKopCYmMg25xgbG7OzhYzmKU3TPWYLe89LdnR0YNmyZbC0tERzczOmTJmCzMxMTT3ER+hrDIKiqEfGILy8vBAWFoaff/5ZQytVng0bNrDp5O6Ym5uz/65CoZD9d9U266x58+ahqakJFy9eVNk9FH09cMHmzZvx7LPPAgC+/vprbNy4kfN7cAFv78XD8/8xMjJiDYlNTEzYD0um1iUWi+Hn5weCIODm5oa0tDRQFPVIDU8ikWDSpEnsvGT3uqSVlRWWLFkCb29vvP766xp6pP+Hjo4OvLy8QJIkOwZB03SPzt7eCIVCvPvuu9i8efOwPWW+++67mDFjBmJiYvD111/Dz88PJEnCzs6Otc4qLCzU9DL7xcnJCc8//zy++uorTq87lNeDsujr6yM3N5fNvmRmZmLs2LEquZey8AGT5w9N94HqkSNHIiMjAxRFITs7m9VxHTlyJEiShL+/P4qKikBRFFJTU3vMFvb2lywoKMClS5f6nZf89NNPceTIEY2ozgAP18t09lZUVICmaSQnJyucbpw9ezY6Ojpw4cIFFa+Ue9zd3XHz5k1WaebKlSvsv0VGRsawcDQBgDfeeAPHjh3jxBNT2dfDYOldFw4PD4evry8AYM+ePfjrX/+qkvsqC++HyfOHpPsoCDNQ/dtvv7EjHDY2NmzNprm5GRRF4cKFCz0G3o2NjREeHo7AwEAYGBigoqJCYR3XwsJCjB8/Xq0Bs/sYhEAgAE3T+Pnnn4eUbkxISMCqVasQFRU1bDpkgYeBYcGCBT1k2dLS0rB3714NrmpoMM1LQw2YXL4eFKW/uvCXX36JF154AVOmTOH81KwO+BMmzxNH71EQJuXKNC4YGhqyKVkzMzPIZDLQNI179+6x1xAKhZg0aRJCQ0NhYWGB+vp6yGQyXLp0aVBD6j4+PlixYgU++OADlbrO6+npsYpDdnZ2bB2KizGIv/zlLzh//rzWa5v2DgyJiYlYs2YNIiIiUFVVhWnTpml1+rU/zMzMsGHDBmzcuFHhU7EqXw+PWyfzvtPR0QFFUf3WhWfMmAGhUIhz586pbD3KwJ8weZ5oeo+C9J6bE4lECAgIYDUumXpjTk5Oj0AWEBCAyZMnw8nJCe3t7ZDL5dixY8eQB/WZ1N/YsWPx+++/c/JYGYRCIby8vEAQBLy9vZGdnY3r169znm6kKApSqVQrAybTsEIQBGxsbB4ZAYqOjoaDgwNeffVVtXWack1NTQ1KS0vh6+v72HGMvl4P165dU+lYjJ6eHvv8M++7I0eODLgxYbqxz58/P6wyF3zA5Bm29PZazMvLe2QU5HEalwx2dnaIiIiAl5cXdHR0UFRUhF27dnHmEp+bm4sxY8ZwFjCdnJzYNHNVVRUoisKJEydUVoeSyWQIDw/XGhNgRseVJEl4eHggMzMTV65c6bdh5d69e0hNTYVEIsH169c1sGLlYdKyfQXM7q+HyspK0DSt0tdDb8u6nJycR953A1FeXo66urphZ2PGp2R5hh29R0FomoZMJmNHQSwtLdnvd3R0sKmh7hqXhoaGCAsLQ1BQEIyMjFBZWYlbt27h+vXrnKdO3dzc8Oqrr+LDDz8cssKJmZkZOwYhEonYNLO6Tk3Lly+HXC5HfHy8Wu7XF66urqyOa1lZGduwokiKfNSoUZgzZw6+//57NayUe8zMzPDbb78hMzMT33//Pe7fv8+mn9X1enB0dGS1hB88eACKopCUlDRk6b7x48fDyckJhw4d4nilysOnZHmGNX2Ngmzfvp0dBTEwMEBoaCg7S5aYmPiIxqVQKMRTTz2Fp556ClZWVmhsbERiYiIuXryoUr3OgoICtLa2YtKkSYiJiVH493qnmVNSUjjrlhwsCQkJmDx5stoDJiPwLZFIWH/JoQzS5+bmwsDAAPb29igtLVXRalXHBx98gDFjxmDMmDGYN28eduzYgeTkZJW/HhjfVpIkoaenB5qmORszkslkCAsLG1Y2ZnzA5NFaGA1Lpu6YkZGBCxcusKMgOjo67LwkM0t2+fLlRzQuvb29MW3aNLi4uKCjowNZWVnYt29fjyYfVZOZmQmpVDpgwOye7vL29mbTzBkZGRrV35TL5Vi0aJFaVGcMDQ3ZhhVLS0skJibiwIEDCgl89wejYiSVShEZGcnhalWLUCiEp6cnJkyYwH7N3Ny8T1cQrmA8TkmSZH1bT548ifz8fE7rjQ0NDSgoKIC/v/+AvqvaAp+S5dE6eruCJCQkICUlha2f9Z4loyjqkdScjY0NIiIi4O3tDZFIhLt37+LKlStITk7WyGOys7PD66+/jn//+999phAdHBxAkiSCg4NRXV2tdLpLFcyZMwetra2Ijo7m/NoikYgV+HZ3d4dcLgdN08jKyuIsRW5tbY21a9fis88+U2nHMhf0rlPr6+vjH//4B3R1dXHo0CG8+uqrnN6vdz9Afn4+aJpGWlqaSjdqQUFBCAkJwfbt21V2j6HACxfwaDVmZmYgSbLfURBmVIQgiH6lzPT19TFt2jQQBAFjY2M8ePAAt2/fxrVr17TCHeGTTz6Bg4MDoqKicPDgwUfSXUytVVtVdezt7fHiiy/iiy++4OSkIRAI4ObmBoIgEBAQgHv37oGm6R6bI65Zt24dYmNjkZGRoZLrKwMzltFfXdLBwQHz589HZmbmoFL7j6MvfeTExES1eZyKRCK89957+Pbbb1FbW6uWeyoCHzB5tI6+RkG6S5UxLesDSZmNGTMG48aNg62tLZqampCSkoKoqCitMjYWCoVISEiAm5sbAODChQtIT09HamoqKIriPN2lKjZs2IDIyMh+lY0Uwdramv2Qbm1tBUVRkMlkavnADA0NhYeHB/bv36/yeymCnp4eO+7E1Kkpiuq3Luni4oJnn30W//3vf4d8z976yDKZDBRF9dBHVifPPPMMKioqtEqMnW/64dEK+hsFYWp03aW0mJb169evo6WlBeXl5eyH6qhRozB9+nS4ubmhq6sLOTk5OHz4sEoEo5VFR0cHY8eOZYMl8LCTd+PGjVpx8h0MCQkJkEqlgw6YTNMWQRAwMzNDYmIi9uzZo9Y6MgAkJSVh9uzZMDAw0JgbiTJ16qKiIgiFQjg7Ow/qtd6XPnJkZKRWeJzSNI158+ZpVcDsDz5g8qiFvkZBIiMj2VEQJycnVkqrqqoKNE3j1KlTaGxsxJYtW/DMM8+grq4OmzZtgp6eHnR1dXHv3j0cPnxYaxsG+hqDIAgCAHDo0KFhFyyB/+tsVGQmUyQSsR/SI0aMYMUimKYtTdDc3IzMzEwEBASoveOXGctg6tQ0TeP06dPse0BRmNfRQAGztz5yYWEhaJrGvn37tKorNS8vDwYGBkM2+1YnfEqWR2UYGhpCIpGwpwqapkFRFPumGKhmAwAeHh64ffs2+/f09HT885//RFxcnFYGnO5+gswYhEwmQ3V1NXR1dTFt2jQEBATg9u3bw2JH3RcvvPAC0tPTcefOnUe+JxAI4O7uDoIgWBF7mqaRmprK6vdqGj8/P0yYMAG//vqryu/V11gGRVFK1amtrKzw6quv9tu81Jc+skwm66GPrG3MnDkTXV1dWiPyz6dkedRCX6Mg3U8Venp6CAkJ6SGl1dcsWXBwMCZPngw3Nze0tLRAT08PAHD27FlcunRJEw+tX/qSZ/vtt98eOQG0trbi/PnzSE9Px6JFi4ZtwExISMDSpUtRU1ODrKwsAA+bR5h5ycbGRtA0/YiIvbYgl8vxzDPPwNzcHNXV1ZxfX1dXFwEBASAIQiVjGZWVlejo6MD69etx5swZ5OfnP5Lypmkau3btGjYzpzKZDCtXrtR6kX/+hMnDCb1HQZhRj5aWFnaWjCRJeHl5ITc3FxRFPaJ52ts6q7CwEBcuXICNjQ3eeustWFlZYd68eYMSP1cVvW2LBusn+Pbbb+PgwYMqFcNWFZ9//jleeeUVdHZ24tdff8W9e/dgbGz8iK+oNrNgwQJUV1fj8uXLnFxPIBDAw8MDBEGofCzD2dkZ165dg6mpKRobG/Hdd9/B0NDwEcu64cbrr7+OEydOID8/X9NL4btkebinuzuBUChkxyKYUZC+NE+Tk5N7zBYaGxsjIiICgYGB0NfXR0VFBa5fv96nddZ//vMfXLp0CXFxcWp7jL3py7ZoKH6CU6dOhZmZGU6cOKGahaoIkUiE4uJi6OrqAnjYhPLMM88gJydnWH1Iu7m5YdGiRfjf//6n1HXs7e3Zk3VdXR0oikJiYuKg65KDYd26dfj000/Zv//444/45JNPtCblPVQmT54MCwsLrXhP8ClZHk5g0k0kScLBweERdwIzMzNMnjy5h+bppk2betQlRSIRJk2ahNGjR8Pc3Bz19fWIj49HTEzMY0+PmZmZCA0NVXvA7L0x4MJPkKIobNiwAWfOnNHKWmxvmAamoKAglJeXw9nZGQBw8+bNYSWezVBQUACxWAxHR0eUlJQM6ndNTEzY2ryhoSFomsbWrVuH7GijCIxEIEEQsLCwYMsU7e3tOH78+LAPlgCQmJiI1157DadPn9Zac2/+hMkzIH2pgCQkJLBt8N1rNk5OTuy8ZF91yUmTJsHBwQFtbW2Qy+WIjo5W+IOGUcv5+OOPVa6A03s+rr8ZUGVYs2YN4uPjkZSUxNk1ucTc3JztbO7q6mIzCHp6etiwYQOkUimee+45ldQB1UF4eDh0dXUVksoTi8Xw9/cHQRBwdXVl52fz8vJUdrI2MDBAUFAQSJJkJQIpikJJSQkCAwOxePFiiMVivPfeeyq5vyZYu3Ytrly5gvT0dI2ug0/J8gwaGxsb9gOzoaGB7bZraGjoM4hSFIX09PQeJyYnJydERETA3d0dQqEQhYWFiImJYZtFBssHH3yA5ORknDx5kquHydJ7Pq6/WitXMGLyO3bs4PzaQ6W3mERSUhISEhL6HGFYsWIFUlNTkZCQoIGVKo+NjQ1efvllfPbZZ30GPabjlyRJ+Pn5oaCggK1Lqmoso7d1mVwuB0VRfUoECoVCvPfee0pnO7SJadOm4fnnn8eFCxdw+PBhja2DT8nyKIShoSH7Qc502+3YsYNt5LC1tcXEiRP7nacEHtYlw8PDERgYCAMDA1RUVODcuXO4efOm0hqeSUlJCAoK4jRg9p6PoyiKnQFVJWlpaZg/fz5MTU01KgvWe/OTm5uL33//fcCNAkVRGDNmzLANmBUVFaitrcW4ceNw69YtdqPXfWa4vr4eNE3j3LlzKlWOcnFxAUEQPfSRjxw58tgSRWdnJ5KSkiCRSDiTytM0H330EQICArBo0SJ4enpi48aNml5SD/gTJk+PUZBRo0YhPT0dFEUhJycHnZ2dMDIyYms2jLVWbyktXV1dtnbJ1CVlMhkuXbrEaVeroaEhPvzwQ3z77bdKdWN2n4/T1dVlOzzVreO6cOFCPHjwgLNuzcFgY2MDqVTKbn4G27DC6ID+73//08rxkYEwMjLCpUuX4OXlhaysLHz00Ufw8PBQW8evhYUFW5cEHtVPVgQXFxcsWbIE33zzjaqWqRYEAgF8fX1x7do19mtXr17F/PnzNbIe/oTJ8wjOzs6QSqU9RkEOHTqElpYWiEQi1uKHUWk5f/58j25IkUiEcePGYfTo0bC2tkZLSwvkcjm2b9+usgaIxsZGVFZWIjw8HHv37h3U73a3LXJyclKZbdFgoGkaCxYsUFvA7J5BMDU1BU3T2LZt25B0RNvb25GamgqJRIKrV6+qYLWqZe7cufDy8gIAeHp6Yt68efjvf/+r0o7f3vrISUlJOHTo0JDHi4qKiiAQCAYtlactWFtbs5uG1tZWJCYmIjg4GMDDmWttgw+YfzD6GgXpbsjr5ubGyrndvXsXFEXhwIEDPbrwSJLE+PHj4eDggPb2dmRnZ+PgwYNqe8Pevn0bYWFhCv1sX7XW27dvP1Jr1RQFBQXQ19dXqSzYQGISykDTNObMmTNsAmb3uuS0adN6fC8yMlIlHb/d55C9vb1ZfWSuauOKSuVpC4zfKUmSsLCwgEwmw969e1FSUoKff/4ZM2bMwP3793Hjxg1NL/UR+JTsH4C+RkG6d3x2b1lvb29nuyG719VGjRqFadOmwc3NDQKBAAUFBYiNjR1y844yCIVCfPLJJ9i9e3e/Nk29bYvUMR83VFQlC9bdN7S8vLyHmARXCAQCvPPOO0M+paqLvuqSMpkMCxcuxNKlS1FeXo7Vq1dzek9HR0fW4/TBgwcq8zgdSCpPG9DR0YGvr28Pv1NGZEEb18x3yf7BYHbSUqm0zy5WRs6NJElYWVkhMTERJSUlaGpqYlu67ezsEBYWBi8vL4jFYpSVleH69et9aoiqmz//+c8wMjLCL7/8wtbPetsWMTUhbf4gBx76HK5YsQJffvml0ie+gcQkVMGsWbPQ0dGBqKgold1jKDCvB8Yftb+6pJ6eHt599118+eWXSgczTdXG161bh0uXLiEzM1Ol9xksjN9pYGAgSktLQVGUSv1OuYKvYf5B6GsUhOli7UvO7fLly8jMzMT8+fNx7tw5iMViXL58GTRNw9DQEFVVVYiNjdUaE2YGDw8PrFy5En/961/xr3/9C+3t7XBzc0NqaqrW2BYpyr1799Da2gpXV9d+fRAfh1gsZjMIjo6Oj4hJqBqZTIYVK1YgOjpa4895XzZWZ8+efezroaWlBRkZGQgMDOxTYWogtKE2LpPJQBCEVgRMS0tLNrvT0dEBmqbx/fffo6amRtNLUxr+hPkE0NcoSHdXEEai7nFybrGxsWyxHQBWr16NqKgolY9WDAU9Pb0ePoo5OTl46aWXVDofp2qmTp0KU1NThcdles8I9jcHqy7WrVuHW7dugaIotd+7Pxur1NRUhV8P3t7emDZtGn755ReF79m7Nq4q7VhFMDIywttvv43PPvtMI6o/vUUWkpKSQFEU7t69q/a1cAF/wnzCMDAwgJ+fH4KCguDm5oaMjAxER0ezNYHeEnUURT0y4GxhYYGZM2fC19eX1QYFgMLCQq3Qc+yNqakpW2utr6+HsbExACA+Ph6JiYkaXp1yJCYmYv369Th9+vRjazrW1tYgSRIkSaKxsREURal8RlARTp8+jRdeeAEpKSlq+8C2tbVlXw/KOqRkZWVh8eLFsLKy6iHj2BvGlaX7HPLZs2c1/vw3NDQgPz8f/v7+oGlaLffsS2SBESXRxrokF/AnzGGEmZkZfHx8EBAQABcXF2RnZyMpKQnp6eloa2vr0dzDpOZ6S9QJhUJMmjQJY8aMYe2Nbt26hfj4ePz1r3/FhAkT8O2332pNPaov2T2apmFiYoJ//OMfcHZ2xqJFi54IpZP+6lDM7l0qlbJdhQkJCVpn3bRkyRJUVVXh4sWLKrtH75lgmUzWI5uiDHPnzkVLSwuio6N7fN3Y2JjN4DC10N5zyNpAYGAgRo8eje3bt6v0PowzUWBgoMqayTQN3/QzDBGJRHBzc4OHhwd8fHxgamqKzMxMpKamQi6Xo62tTWGJulGjRiE8PByurq5ob29n5yp7N4OEhITAx8dn0DOOXMJYJZEkCR8fn8emG9esWYPbt28jOTlZQ6vljnXr1mHRokWIjY3F119/zf67enh4IDMzEwkJCVrbVQg8dO548cUX8cUXX3BauxOJRPD19e0xE8wIa3B5n6lTp+Krr75CRkYGPvjgA5iamoIkSbYWStO0VruyMEIS3377LefKUYwxukQiQVdXF9tlrMpmMk3CB8xhgLm5OZycnODi4gJXV1c4OTmhtLQU2dnZyMzMRGFhIftmVWRswtjYGDNmzEBgYCB0dXVRUlKCmJgYpKWl9bsGPT09vPPOO/jqq6/UXr+0t7dnH1NNTQ1omh5wFEQqlcLf3x+7d+9W40q5x8bGBjKZDAYGBgCA69evIzIyEgkJCUhOTtYKD1BF2LBhAyIjI5GTk6P0tZiZ4ICAAJSUlICiKKSmpqos5UtRFEaMGAHgYVni+++/Z2uhw8UN5JlnnkFFRQUn5uT6+vpsJz1jjE5R1LCZ91QGvoapJlxdXVFTU9NvR5hQKISlpSVsbW1hY2MDGxsb2NrawtbWFi0tLbh37x4KCwsRGxuLwsLCHmmOvlJDfc2/jRs3DuPGjYOVlRXq6+tx48YNxMbGKvSmZ9R6goKCcPPmTeWeDAVgrJJIkoSBgQEoisKWLVsUVgpKSUnBvHnzYGhoqJUNSopgbm6OWbNmscESAIqLi7Fp0yYNrmpoUBQFkiSHHDCZDsvuM8HfffedSrV2GbUZBwcH9msNDQ0qT22qAoqiMH/+/CEHzN6d9FlZWbhy5YrCxuhPOnzA5JDvvvsOL7zwAurr67FixQpkZWXBzs4OdnZ2sLW1hbW1NczNzVFTU4P79++jvLwcBQUFiI+PR3l5eZ8mxCKRiG2THzFiRL9t8i4uLqwrSFdXF7KysrBnz54h1XYoikJYWJjKAiZjlUSSJFxcXJCamorTp08PySqJCfBDHQnQFL0l0lJSUhAdHY3w8HA0NDTgp59+0vQSh4RMJsP06dOhq6ur8Kmsr5ng/fv3q7TDklGbIQiCtc7auHEjPvjgA3R1deE///mPyu6tSvLz86GnpwcHB4ceneQD0V3kgumkP378+KCN0Z90+JQsRzANKQx5eXnYvXs3ysrKUFZWhvLycpSXl6OqqmrAnZpAIOiRjmIk6nqnhkxNTREREQF/f3/o6+ujvLwccXFxSrf2C4VCvPPOO/j11185G7juPQZRWFgIiqI4GQXx8fHBlClTtP5E1pdEWm/7sBEjRmDNmjX46quvNOpgogwvvvgiEhMTH9ut2ddMMEVRyMzMVFmNtntX56hRo/pUm9HV1cWqVatw/fp1pKSkqGQdqiYiIgJisXhAn09zc3O245cxRqdp+olooFMWPiWrAnR1deHr64vAwEB4e3ujoaEBRkZGAIALFy7gu+++G/AaY8aMwc6dO2FkZISPPvoIRUVFkEgkaG9vR0JCwiMFfJFIhMmTJyMkJATm5uaoq6vDrVu3EBMTw1mdpbOzE4mJiSBJUuluWXVYJWVmZmLx4sWwsLDQyiYEJycn1j6sqqoKFEXh5MmTfaaQmQYngiAQFxengdUqD0VRGD16dJ8Bs/tMMGNjdezYMZXWaJmuzu4mA4cPH+6zq7O1tRV37twBSZLDNmBSFIVXXnkF586de2Tz0Zf4uzpFLoY7/AlzkBgaGsLPzw/+/v4YOXIk8vPzkZycjLS0NHh7e2P9+vUoKSnB559/rtCHQHR0NKRSKYCHb9aXXnoJMpkMLS0tPep4EokEEydOhIODA9ra2pCeno7o6OjHzowpgzJybUyttbsdmKqtkubPn4/a2lrExsaq7B6DwczMjK3NikQi9jlQ5N9rxIgRWLhwIf73v/+pYaXcY2RkhGPHjqG4uBjff/898vLyWLk+ZiZY1SeZ3tZZjPm5IhsqXV1dvPvuu/j666+1Unt4IHR0dHDs2DHo6elhy5YtOH78+ICZDZ6e8CdMJWB2ZUFBQXB1dUVWVhZkMhl+++23HrtUmUyGV155ZVDX7j5kXV1djd9//x2nT5+Gr68vKIrCwYMHewieb9u2jZMOxIG4d+8empubMWLECOTl5Q3480yttXsbfm87MFVC0zQWL16s0YCpq6vL7t7t7e2RkpKCY8eODVrurqCgACKRCI6OjigpKVHRalXHu+++i9GjR2P06NGIiIjAjh07QNP0kJ6LwcCVdVZraysyMjIQFBSklY4ZA7F27VpMnDgRwMMxsXHjxiE7O/uxmQ0exeAD5mOwsrLCxIkTERwcjJycHMTHx2Pv3r2ctpi/9dZb+O9//wtjY2N8+OGHWLFiBXx9fQE8tNHKy8vD1q1bNdLQQlEUpFJpvwFTIBBgxIgRrCRZcXExKIrCvn371C5RV1hYCB0dHTg5OalVjksoFLIzo97e3sjLy8ONGzeQkZExZIk0Zs6NJMlhFTCZGu348ePZrxkZGWHz5s0q+zfp/fxzZZ1FURQiIiKGVcBkNG2nT5/Ofk0oFOLcuXMqFZP4I8EHzD6wsrJCREQERo0ahVu3buGbb75RmfRVXl4eli5dismTJ2PKlCkgSbLH9zUVLIGHJ+Y333wTx48f7/Hhw8izEQSB5uZm0DStkmHpwcL4AqojYDo4OLC1uOrqalAUhVOnTnG2e6dpGq+++irOnj2rtUIFDA4ODpBKpWyNdv/+/fDw8ICRkRHOnDmjkn8PVT//OTk5MDMzg42NjcrM0LmgdzNdQUEBNm3aBHd3d7i5ueHKlSu4dOmSppf5xMDXMLthYmKC6dOnIyAgANeuXcPvv/+u0oHlkJAQjB8/HnZ2dmhtbUV6ejqioqKwYsUKLF26FNnZ2VixYoXK7j8QPj4+OHXqFAwMDLBx40bWEcHc3ByJiYmgKGpQreuqRtW+gN2tm/T09NhanKqsm9atW4eYmBjI5XKVXF8Zus/P6uvrg6IoUBTF1mjNzMwQFhYGoVCIw4cPq+yeqnz+Z8+ejfb2dq2RieyOtbU1pFIpq6PL1GiZjb1QKMTYsWPh6+uLbdu2aXi1ww9e6ecx6OnpYdKkSRg7diwSEhJw+fJlleX5R40ahenTp8PNzQ1dXV3Iy8vDpUuXkJ+f3+PnRowYgbVr1+Jf//qXxlRG9u/fj5kzZwJ42Dn71ltv4caNG1otz8Z1kOnLuommabVYN40ZMwbu7u44cOCASu+jKIx1FkmScHV1RUpKCiiK6ve5MDY2xltvvYWNGzcOOUXf/Z7MzO7j7sklqpL6GyrM7ChJkjA3N2d1dPvTFBaJRHj33XdVLvzwJMI3/fSBjo4Oxo4diylTpiAzMxM//PADqqurOb8Pk+L18fGBWCzGvXv3cOTIkcfOqeXn56OlpQWTJ09+RAxalTBWSQRBYOTIkezXW1pacOjQIa0fZGaUZpQJmH3p896+fVvt1llJSUmYNWsW9PX1NSaN171OHRAQwM7P7t27d8AgWF9fj8LCQvj5+Q3KTaa3XVdBQQESEhIUuieXlJaWorGxESNHjkRubq7a7tudvhxBLl68qNCmtb29HWlpaQgODsbVq1fVtOInm2EdMN3c3PDBBx+gvb0dH3/8scINEgKBAARBIDw8HGVlZdi2bRvnzg/6+vqYPn06JBIJjI2N8eDBA8TFxeHKlSsKf+imp6eDJEm1BEwbGxu2Db+5uRkURWHFihX44osv4Ovri6+//lrrgyXwMMjMnDkTenp6g3ZP6K7PW1tbC5qmWfNtTdDU1ISsrCwEBQXh9u3bar23lZUVayPW0tKChIQE/Pe//x20dRZN05BIJAoFTOY12N267Pz58xq1zmIa39QZMJkNg0Qigb+/P8rKykDTNI4cOTLojRNN05g7dy4fMDliWAfMXbt2ISgoCADg6OiI+fPnD/g7vr6+mDFjBpqbm3Ho0CGFRiYURSgU4qmnnsLYsWNhbW2NxsZGVvJsKG/6ixcv4u2334apqalKUipGRkbsvCRjPL1r164em4dFixZh/PjxcHR05Pz+qqCpqQk5OTkIDAzEnTt3Bvx5pi5GEAQMDQ1B0zS2bt2qNY0eFEVh8uTJagmYvU2AExMTsWfPHqU6ddPS0jB//nwYGRn1ufHoy/x8586dWmNdNhSpv6FiY2PDNtM1NTWBpml8//33/epSK0JeXh6MjIxga2urdXZkw5FhHTC7f4i7ubk99mdHjBiBmTNnQl9fHxcuXEB6ejpn6/Dz88OUKVPg7OyMjo4OZGZmYv/+/Uo3xFRWVqK+vh7Tp0/H8ePHOVkrY5XEpFwzMjIQFRWF7Ozsfus0iYmJCAsLU8uHBhfQNI3x48f3GzAZLVuCIODq6orU1FScOXNmSFq2qkYul2PRokUDGhsPFUaijiRJeHp6cm4C3Nraivz8fCxfvhzHjx9HeXk5dHR02Negu7u7Qq9BTVFfX4+CggL4+flBJpNxfn2mLimVStkNw44dOzgT+ejq6kJiYiIkEolWNi8NN4Z108/q1avxxRdfAHgoRXfp0iXIZDLk5+ejpqYGQqEQLi4urEJOVFQUZDIZJ29KBwcHREREwMPDAzo6OigqKkJcXNxjrbOGwpw5cyCVSpUWgx4xYgQIgmCtkmiaRkpKisIBcOXKlawhtbajo6ODDz/8EMePH0dqaira29v7bL+naZoTLVtV05+xsTJ0l6hjxLaTk5M5T7ubm5vjypUrcHZ2Rk1NDb744gvY2NigtLSUvae2b8KYE/COHTs4uZ4imrZc4ujoiD/96U/46quvOL/2k8oT2fSzfft2HDt2DH/729/w+++/4969e/D398fMmTNhYmKCzs5OlJeXIyEhAfv371e6YcPY2Bjh4eEIDAyEgYEB7t+/j/Pnz+PGjRsq6xq9dOkSJkyYMGj3AeD/6lASiQRtbW2gaXrIHXMURSE0NHRYBEwbGxssW7YMGzZsQEpKCr755hv4+vqioaFBJVq2qoaiKCxfvhwXL15UarNnamraQ6KOpmn88ssvKpNXFAgEWLBgAZydnQE8HDXx9/fHBx98oFSaUd2kpaVhwYIFMDExGXQNtzvdHUHKy8sfq2nLJSUlJWhvb4erqyuvGaskwzpgAmCHloODgxEZGcn5B3pvsfP6+nrcuXMHMTExaulcbG5uRmVlJcLCwrBnz54Bf74v26J9+/YprRiTnp6OBQsWwMzMTOs/7J5//nnY2toCAAICAhAcHIzNmzerVMtWlZSUlKC1tVVhmcLudLdSc3Z2RkpKCo4fP/7IGBOXMP6SJEnCxMQEbW1tEIvFAICTJ09q/eunN21tbUhNTUVwcDCuXbs2qN/tvknR0dEBTdP4+eef1e4IwsxQ8wFTOYZ9wAQeCpiHhIRw6lZBkiQmTJgAe3t7tLa2Qi6XY+vWrSrbjT+OW7duITw8vN/v6+jowMfHh03xZGRkcFqHAh62qCcnJ4MgCFy+fJmTa3IJM6/HNPAwdHZ24vTp08M2WDIkJCQ8VqawO32ln+/cuYPdu3erbCym+4yghYUFZDIZdu/ejXv37uHMmTN46aWXUF5ePmwl2miaxuzZsxUKmGKxGAEBAezsbnJyssp1dAciMTER69evx+nTp7V2hno48EQEzNraWtTU1CAiIgIHDx4c8nXc3d1ZUQGBQID8/Hxs3bpVYzNYDNevX8fs2bMxceJEXL9+nX3Bu7q6giRJBAYGorS0FDRN49ChQypL8VAUhcWLF2tNwBQKhRg1ahQIgoCvry8KCwtB0zQOHDiAlStXYt68eUhNTX3svOtwgZEpPHnyZL81V0aysPtYhirTz903au7u7v3OCN68eRMpKSl46623hk3jWG9yc3NhbGzcb7cpMwoilUrZTYomZnf7o6qqClVVVfDw8EBmZqamlzNseSICJvBwB95d9FlRGFEBb29v6OrqorS0FMeOHdOqWp2FhQUWLVqEtWvXQiaT4euvv4afnx86OztBUZTKBBd6U1hYCIFAAGdnZxQXF6v8fv3B+EsGBQWhpqYGNE3j7NmzPQLDli1bcOjQIWzYsAE6OjrD3saorq4OhYWFIAiix4hJX+ovu3btUqlkoaurK/v8K7pRq6+vR25uLoKDgxEfH6+ytakKRhB/1qxZOHXqFJvJ6q6r3NTUpPJNijLIZDIEBwfzAVMJnpiAGRcXh2nTpmHkyJEDpq16iwpUV1fj6tWriIuL04rdYG+ee+452NjYAHjoizl+/Hj88ssvGglaNE1DKpWq/d6WlpaQSCSQSCQQCoWQyWT49ddfH6sjWlNTg7KyMnh7e3PevaxuhEIhFixYgG+++QZyuRx///vf4ebmBg8PD2RkZCis/jJULC0tWWGLoW7U7ty5gylTpgzLgAk8nElevHgxNm7ciE8++QTAw+ele/pZm0lKSkJ4eDhEIpFWfs4NB56YgNna2orS0lJMmzatT7FhkUiECRMmICQkBFZWVmhqakJycvKQRQVUjY6ODry8vECSJMaMGdPje6dOndLYCY+mafz5z3/GmTNnVH5qMzIyQmBgIAiCgJWVFZKSknD48OFB+Rsyu+rhHjAnTZrEehx6e3vjtddew1dffaXSLkt9fX3WX9LGxgZJSUn47bffhvzak8vlWLhw4bAcore2tsbixYsBPBR4eO655/Dyyy9z2iegaurr61FcXAwfHx+kpKRoejnDkicmYAIPa32LFy/uMeRNkiTGjx8PBwcHtLe3IzMzE/v27dPa3WD31vOKigpQFIWjR49i9erVmD9/PpKTkzVm9wUADx48QHl5OXx8fJCamsr59bs374wYMULpBqbk5GTMmjVrSFJ52oCbmxtIksTUqVN7fD0qKkolJzWhUMhu1Ly8vJCZmYkrV64gMzNT6Q1SZ2cnEhISEBISgrNnz3K0YtXCdPyOHj0aDQ0NMDIyAvDws0YbXWQGghEx4APm0BjWwgW9mTZtGg4cOACxWIyzZ88iPz8fAoEABQUFiI2NRVZWlqaX2CdmZmZs67lQKGRti3p3/FpYWODPf/4zPvvsM43W5JjGBkXGXBShv+adtLQ0ThpEVqxYwTprDAcsLS3ZulhHRwcSEhIgk8mwYMECrFy5EvX19Vi4cCGnrwFGyCAoKAiVlZUqEzKwtrbG2rVr8fnnn2ttXbn3aBbjCmJlZYW//vWvcHNzwzPPPKPUTKamMDAwwD/+8Q989tlnw3IDqS7+EPZep0+fZht/urq68PTTT+P69esaXlXf6Orqsukue3t7VkVnoDmpV199FZcvX0ZGRoaaVvooenp6eOedd/DVV18pZYPWu3lHJpMhMTGR8xR5YGAgRo8eje3bt3N6XS4xMDBgXw/W1tas32hv82UdHR28++67+Omnn5QeoWI2agRBQCQSsRs1Vc8Irl27FteuXVNJhmKo9HYFycjIAE3TfWY2Vq1ahYSEBCQlJWlotcrxwgsvIC0tDQkJCZpeitbyRCr99Kb7cH5FRYXWBUtmPk4qlcLX1xd5eXn4/fffkZGRofBuWyaTQSKRaDRgtrS0ICMjA8HBwbhx48agfpdp3iEIAgKBQKHmHWVJT0/HokWLYGxsrFX1akbHlSAINv0ZFxcHuVzeb/q5o6MDSUlJIEkSly5dGvQ9mY0aQRBwcHBAcnIyjh49qtaB9vj4eISEhGhFwHRxcWFP1mVlZQqp79A0DZIkh23ATExMxJgxY5CUlKT1spDaxhMVMP/xj3+gqakJ48aNw+bNmzW9HJbu83ENDQ2gKGrItlFJSUmYMWOGxufZKIpCRESEQgGzr+adQ4cODap5Rxm6+wJqwyaqLx3X48ePK5z+pCgKy5YtUzhgMilvkiTh4+ODvLw83Lx5ExkZGRrplkxOTsa8efNU5sIzEBYWFuzJGngYAH/88UeFT+ypqamYP3++1m3AFMXX1xcbN27Ev//9b6xfvx4nTpzQ9JKGDU9USpZh6dKlGDlyJD7//HONrUFfX591IWDqIAkJCZzYFr344ouQyWQqcU9QFIFAgHfeeadfK6y+mndkMpnGugo9PDwwc+ZM/Pjjj2q/N/Aw/SmRSFgdV2XTn2+88caA6jH29vaslnB1dTVomkZiYqJSaXSueOaZZ1BeXq42n0Y9PT025W1ra8uWQIa6aXv22WdRUlKiFRuwwZKWlgZ7e3sAQEFBQQ9lLJ6H/CFSsgxRUVH4+9//DnNzc7UM9DMIhUJ4eHhAKpXCy8sLWVlZiI2NRWZmJqdBgqZpEASh0YDZ1dWFtLQ0vPzyyzhx4gTS0tIeq7yjaXWXnJwcmJiYqHWkQVdXl5VIc3BwQEpKCmcSaRRFgSTJR67F+HuSJAl9fX3QNI0tW7Zojb8nA03TmDdvnkoDplAohKenJwiCgLe3N3JycnDt2jXI5XKlG45omsbMmTOHTcDU09NjN/BCoZD9uipLIU8iT2TAfPDgASuVd+jQIZXfz9HREQRBIDg4mBWDP3HiBOcdhgyMEHp/przqQCQS4c0330RgYCDeeOMN/Pjjj2hvb0d1dTVkMtkjyjuapqurixWgvnDhgsruIxAI4OHhwW4aVJX+bGtrw6effoq//OUveOedd9Da2gqSJOHq6oqUlBScPn1aK/09GfLy8mBgYAB7e3vOzaKZ96NEIkFVVRVomsapU6c4PVlrYgM2WJieiZCQEPj4+CAnJwdxcXGIiYnBv//9b3h4eODvf/+7ppc5rHgiU7IAEB4ejvHjx+Ojjz5SyfWZFBtBENDV1QVN06BpWm07tmXLliE/Px83b95Uy/16I5VKe/gzXr16FWvWrNHqHaudnR1WrVqFL774gvNAYmdnx6Y/a2tr2fSnqjY0165dg5+fH4CHOqGffPIJKIpCenr6sGnkmDFjBgQCAc6fP6/0tUxNTdmTtbrej7NmzUJnZ6dKN2BDwdLSElKpFCRJoqmpCXfu3IFMJntkwzB//nzU1dUhJiZGQyvlHoFAAD8/P9y/f18pw4U/VEoWAGJjYzF16lS4u7tzJp7O1EEIgoC9vT1rlVRYWKj2nTxN05g2bZpaA6ZYLEZgYCCkUimcnJxQWVkJKysrAMCZM2e0OlgCQFlZGRobG+Hu7o6cnBylr2dsbMx+SBsaGoKmaWzbtk2lJw5HR0c2xcvQ0NCAnTt3quyeqoKmaaxZswYXLlwY0vunL+uykydPIj8/Xy3vR4qisGrVKkRFRWn8JM90P0ulUtja2iok10dRFJYuXfpEBcydO3di3rx5aGpqwvLlyxEbG8vp9Z/YgNne3o7S0lKEhYXh119/HfJ1GOUTpvU/Jydn0KMgqiArKwuLFy+GpaWlyufmRowYAalUioCAAOTn5+PGjRtIT0/H1q1bsXz5cgQGBmLXrl0qXQNXMLW/oQZMkUgEPz8/kCQJNzc3pKWlITIyErm5uSr70OzL+PmNN97AF198AWNjY7z33nsqua+qKS8vR319/aA2MJqwLusPZgM2cuRIjTga9X4u8vLyBlWjLSoqQkdHB9zc3DRqPcYVnp6emDdvHoCHc80vvvgiHzAHQ1xcHJYsWTKk33VxcWGH6u/fvw+aplValxwsnZ2dSEpKAkEQQ5rHGwgzMzM2rcOozfz3v//toW5SXFyMzz//HCtXroS/v/+wsNGSyWSYPn06xGKxwqlLgUCAESNGgCRJ+Pv7o7i4GBRFYd++fSpLf+rq6rKnp/48FU+dOoVnn31WrY1tXMM0sA0UMG1tbVn1o/r6eq1xBWFmMtUZMLun/+vq6iCTyYb8XDBShcM1YAqFQkyaNAmjR4+Gra0tGhsbYWhoCAAqcWV5YmuYDB9//DEiIyMVSl0yjgwSiQTAww9XdSifDBVnZ2csXboU33zzDSfXE4lE8Pf3R0hICBwdHZGcnIw7d+4MKLYdFBSEkJAQrVbS6Y6iYzmMjihJkmhpaQFFUZDJZCqbHRQIBOy8pK+vL/Lz89m6ZH+nJ09PT0REROCnn35SyZpUjYmJCd58801s3Ljxkc2HkZER2ydgYmLC1iW1yQz8cevn+j5M+t/AwIB9LpRN/6tr/VwTGBiISZMmwcnJCe3t7ZDL5YiKioK1tTU2bNgAOzs7LFmyZMhZhz9cDZMhJycH48eP7zdgGhgYsLqR1tbWah+qVwYmkLm4uCi1XldXV0ilUgQGBqK4uBjx8fFIS0tT+MWWlpaGhQsXwsTEZFjoazIWZX0FzO7+khYWFmqxbup+eqqrq+vT37M/cnJyYGZmBmtra62vIfdFXV0d7OzssHPnThw4cADnz5+Hr68vSJLEiBEjkJ6ejvPnzyMnJ0fjdcK+qKurQ1FREXx9fTlX/mHGkgiCYGu0XHc/19XVoaCgAAEBAVqfIXJwcEBERAQ8PDwgFApRVFSEXbt29RDBr6iowLp16/Duu+/C3Nyc8/fEE3/CdHBwwNtvv419+/YhKSkJ7e3tPZziR40aBblcDpqmOZ+XVAfTpk2DsbExTp06NajfMzExAUmSkEqlEAgESEhIAEVRQz49LV68GKWlpbh27dqQfl+diMVibN++HRkZGdi/fz8KCwvh4+MDgiAG1BHlCi5PT3PnzkVzczMuXryogpWqlvDwcBw8eBDAwzLDwYMHWVGHlJQUjc/vKoJEIkFwcDAndXxmlpsgCPj4+CiUZVCWgIAAPPXUU9iyZYtKrq8MxsbGCAsLQ2BgIAwNDXH//n3cuHEDN2/efOx7c9GiRSgrKxvynOwf9oRpZmaGpUuXYtWqVZDJZNi8eTO8vLwUdorXdmQyGdavX48zZ84M+OEuEong6+sLqVQKNzc3VkeUi/oFTdOYPXv2sAiYS5cuxZw5czBnzhy89NJL2LdvHwoLCxXSEVUG5vnn+vRE0zSef/75YRcwHR0d8fTTT7N/FwqF+P3337Fv3z4NrmrwpKWlYf78+UrNRfee5ZbJZDhz5oxa5qzT09OxcOFCWFhYKC3ozwXd65KWlpaor68HTdO4ePEimpubFbpGRkYGxo4dy7mwxBMfMFetWsUWgSUSCSwtLfH999+jpqZGwyvjhqqqKty/fx9eXl79CrI7OTlBKpUiODgY9+7dQ0JCAucNK7m5uTA2NtbqQW7goY5o9w9pMzMznDt3TqWKLYynZWBgIO7evcu5+tHdu3fR0dEBV1dXtYqoD4XeHb9Xr17F1KlT4ejoiMLCQpw+fVrTSxw0ra2tSE9PR3BwMH7//XeFf6+7XKJYLAZN0yo3IuiLjo4OpKSkYMWKFThz5gwnI1dDoa+65M6dO4ekUpWdnY2lS5dyrrn9RAbM7rqRI0aMYL/e2tqKM2fOPDHBkoGmaYwbNw6FhYXscLKxsTEIgoBUKoVYLAZFUYMSmB4s6lLSGQqMdRZBELCxsUFiYiImT54MsVgMuVyOO3fucH5PKysrVuC7vb0dFEXh22+/VVnDEONio40Bs3strq+O38jISIwfPx4BAQEaEWPnApqmERERMWDA7GuWmyu5xKEiFArxyiuvYMyYMXjvvfewcuVKTsQkFEGRuuRQaG1tRWFhITw8PJCWlsbRap+ggNmXbuT169exbds2vPTSS5g3bx7u3r07LJp5BsuECRPw3nvv4eOPP8ZHH32ElpYWjBw5EmlpaX/YQW6mTs3UJTMzM3HlyhVkZmaio6MDR44cwYIFC5CTk8NZCra7pyXjyrJ///5HPC1VwWBS8+qgr47f27dv91mLa2hoQHR0NDt0r80Ziv7Izs7G4sWL+1x/91lu5rNJG2a5GVxcXDBmzBgAD+v7S5YsUWnA7Ksuee7cuQHrkoNFLpfD29ubD5jdYZRPgoODUVVVBYqiHtGN3Lx5M3bt2oV//etfwyJtNVj+/ve/QyAQwMDAAH/5y1+wevVq/Pbbb2pvmCgrK0NTU5PGBrmBh+lPgiAQGBjI1qmPHDnySO1DLpdj27ZteOWVVyAQCIYc4HV0dODl5QWSJOHp6YnMzExcvnxZ7Q1kTGre09NT6d25MvQ1L6lIxy+ToQgODu4huThc6OrqQkVFBT777DNERkbi2LFjcHZ2Zr02tXGWm6G8vBwlJSVwdHQE8NAvk2u4qEsOloyMDEyYMIHTaw7LgNmXbuSmTZtQWVnZ7+80NzejvLwc4eHh2LZtmxpXqxq6y7I1NjbCzMwMwEO/TE06qTNKOuoMmMy8JEEQaGtrA03TCtWp79+/j9raWowaNQrZ2dmDumd3T8uKigpQFIWjR4+q7M2vCMwQvboDZl8dv9u3bx90x29iYiL+9Kc/DcuAaWVlhffeew/m5uZYuHAh5s+fj+TkZNA0jZ9//llrZ7kBoKmpCXPnzsVLL70ET09P/PDDD5xdm8u65GC5f/8+Ojo6OBX4HzYBs7fySUpKCk6cOIGCggKFTwdXr17FggULVLtQFdKfLNvFixfxwQcfwNXVFX/72980ukaZTIY333wTJ0+eVOkgtJGREYKDg0EQBMzMzJCYmIi9e/eipKRkUNdJTEyERCJRKGCamZmxDStCoVDrPgyTk5Mxa9Ys6OnpqbzzWxUdvyUlJejo6FB6rljdmJiYYOHChTA3N2e/1tDQgK+//lpzixok+fn5+OCDD/Dqq68qnaVwdHREeHg453XJoZCRkQEfH58/RsAcTB1EEe7cuYMFCxYgJCREJY0eqkBRWbbnn38eL7/8MqytrTm3SxoMqhzkFovF8PX1BUEQrCl1VFQUcnJyhpz+TExMxBtvvIETJ070+Zrq7WmZnJyMI0eOaGVav7GxEbm5ufD39wdFUSq5R++OX4qiOO34TUxMRHBwsNYHzN7C75mZmcjKyoKnpydaW1uxd+9eTS9xSDDP/2CDm7GxMcLDwxEYGAgDAwPcv38f58+fx40bNzRaU5fL5Zg6dSouX77MyfW0MmDa2dmxKTZG+SQyMpKTmaS8vDxMmDBB6wOmlZUVWwtqbW1VqMuSSYempKSocaX9r4OLgMkITBMEAX9/fxQVFXE6llFbW4v79+9j8eLFOH/+PKqrq1lPS5Ik4ePjozJPS1VA0zRCQ0M5DZiWlpbsa1HVHb8ymQxr165FZGSkxhvHeiMQCDBy5Eh289pb+P306dOYOXMmpFLpoMZLtInk5GREREQopLXcV12SoiiV1iUHS25uLp5//nkYGBhwUjvWmoDJ1OQIgoCRkZHKrJKio6Oxbt06zudzuICR6SNJEpaWlpDJZNizZ4/CsmzJycmYO3euRo2lASA1NRXz58+HsbHxkMWxu2+amAaBCxcucC69Z2FhgXXr1sHR0RH379/HJ598AicnJ9bTUl3D41zBDKErK1PYu+M3MTFRLR2/lZWVqKmpGVJdWVVYW1uzG4bm5mYkJCTg/Pnzj7y2GxoacPToUbi6ug5bB5D6+noUFxfDx8cHycnJff6MJuuSg6W9vR15eXnw9PTkZAOv0YDZV03u7NmzKrVKKiwsRHNzM6ZNm6a2WaPHoaOjA29vb5AkCQ8PD8jlcsTExAxJlq21tRUZGRmDHqDmmra2NnaQezCCAIzANEEQavOXnDt3LtsdaG1tjZCQEHz88cda+eZXhPb2dqSmpkIikeDq1auD+l1t6fgdTF1ZVfS1eVVUU5jJsAzHgAk8fP6nTJmC0tJS9n2gTXXJwcLUMYdlwGTSGgRBICAgAEVFRSq3SupNSkoKpFKpRgNmd/swpsuyr/GHwUJRlEID1KqGoijMnDlzwIDZe6g9NTUVZ86c4VRgujfdT0/e3t7o6OiAjo4OAODEiRPDNlgy0DSNuXPnKhwwnZ2dWVk2bej4TUxMxLRp0wZlwcYFzIZBKpUqtXmVyWTYsGEDTp8+rfUp/L4ICwvD3//+d3z44YfYvn07Ghoa2HlJbahLDha5XI7w8HClxscY1BYwe6c1KIp6xF9RXVy4cAEhISGwsbFR64ejtbU1JBIJJBIJO3f2008/caq+87gBanWSk5MDExOTfge5mRqht7c38vLylGrmUgRmeJw5PWVlZeHy5cv49ddfcerUKSxduhQdHR1PhPt8Xl4eDA0NYWdn1+9oR/eOXx0dHVAUpTUdv3V1dSgsLIS/v/+AFmxc0NeIkDKb15qaGpSWlsLHx0fj/QSDRSgUYsOGDQAeZgAXLVqEN998U6vqkoOluroa9fX1cHZ2VrqZTKUBs7tVkrm5ORITE1VulaQI9fX1ePDgAcLDw7F//36V3svY2BjBwcGQSCTsc3DgwAGV1YK6urrYeTxNnqD7GuR2cnJiTzJVVVWgafoRkQmu6S5sUVlZCYqicPz48R4NALGxsYiLi8O7774LKyurx87zDge6yxR2fw3o6uqyJ2t7e3tOxfe5JiEhAaGhoSoLmL01bbneMDDG2MMlYHYXf6+trYW+vj4A4NatWzhz5oyGV6c8jOqP1gVMHR0dtvXf3d0dGRkZuHjxIrKzs7XqGB8fH48pU6ao5NrMzChBEHBxcUF6errS4w+DgaZprF69GhcuXNBYp6GVlRXef/99mJmZYeHChZg3bx5SU1Mhk8kGFJlQFhMTE/bDUFFhi87OTiQlJYEgiGHn+tEXjo6O+M9//oN79+7hnXfegaWlJfz9/ZGbm4sbN25ofcdveno6FixYADMzM860n8ViMTsi1JemLZcwDXiGhoYq3RAqA7NpIAgCenp6oGkaW7Zswd69e/G3v/0NjY2N+PzzzzW9TE6Qy+WYNWuW0u/tIQfM0aNHY8OGDSgrK8N//vMfWFhY9JAkoyhKq62zrl69ivDwcDY9pyzdtWyZUYQ7d+5gz549ancyLysrQ319Pdzd3TXiPKCrq4tZs2ax6kPAQ6UlVQ5yi8VitoHM1dUVKSkpg9bRpShqWNpk9UYoFOKTTz6Bvr4+Ro0aha+//hqvv/46zp49O2w6ftvb25GUlASSJBEbGzvk6zBjSSRJws/PDwUFBSpP/wNAS0sL5HI5goKC+jWv1wR6enpsz4CDg0O/AjCvvfaaBlfJPfn5+bC2tlaqcx8YYsDU09PDwYMHWWULkiRx6tQpyGSyYWOd1d7ejpKSEkyfPl2pgOnq6spuFCorK9WSZlQEJiWkroDZW2SiqKgI2dnZ8PDwQFtbG/bs2aOSezKiDgEBAayn5d69e4e0Sbl79y7a29uH7UgAUwJhTMEZcnJyEBcXp8GVDY2EhAQsW7ZsSAHTxsaG7ZlobGwERVE4d+6cUh+Wg4WiKEybNk3jAbP3Zj43N3fYzBVzRWdnJ7KysuDt7a2UdOiQAqahoWEPGagHDx7g22+/HfIiNEVcXByWLVsGoVA4qFQpo10qkUjQ0dEBmUymNQ0TDImJiZg+fbrKJeqYZi6SJNnBZUZk4uDBg5g2bRqmTJmC27dvc3bP3qIOCQkJnDWQMfXf4RIwe5dA5HI5oqOjkZWVhY8//hhGRkZ47733NL3MIVFcXIzOzk6FNzC9eyZkMhl27typMeWrrKwsLF68WGN1caaZKSgoSG09A9pMRkYG/Pz8lAqYgselqywtLfv95scff4w///nPqK+vx7PPPotbt24NeRGa5OOPP8a5c+cGHMNgmncIgoCpqSkSExMhk8nUYt00VFatWgWKojh3H9DX12dPMpaWlqBpGgkJCf12ZK5Zswa3b9/udxBaEXrPxSUmJoKiqEFrxw6EmZkZNmzYgM8++0yrd9+urq6sRB1TAklJSXmkBMLFc69JJk+eDCsrKxw7dqzP7zNzzFKpFKNGjUJGRgYoitKanol58+ahqalJbWl+c3Nzti6po6MDmqZB0/Swb2TjAnt7e+zcuRPXr18fMBNaVVUl6OvrQ65hfvjhhygrK8OVK1c41wxVJ9nZ2Xjqqaf6DJjMjKBEIoGLiwvS0tKUFphWJ0xalouAyYyCSKVSeHl5ISsrS+EZNWYdg/3QFgqF8Pb2BkEQ8PLyQmZm5pBFHRRFm0cCLC0t2Q/Dzs5OUBQ14Bt/qM+9tkDTNF5//XVERUX1SKd2t84qLy/X2p4JddTF9fX1WVNqOzs7JCUlaa3esSb59ttvERoaitDQUBAEgUWLFg36Gkp1ydbX12vdC3SwREVF4dtvv8WaNWtw4MABNDc39zB71WTzjrJwIVFna2sLqVQKgiBQXV2NhISEQXv6paSkYN68eQp3DCoyCqJKKIrSmpGA7iIL1tbWgx5LGuxzr21YWlpixYoVeP3113HgwAEcPnxYa91i+uLu3bvo6OjgvC7OiCwwm8ns7Gxcu3YNcrlcK0yptRE/Pz/2z/7+/kO6hlIBs7Ozk1VIGa6sXr0a4eHhCA8Px0svvYTIyEjW7PXkyZPD8kOGoa2tDWlpaZBIJLh27ZrCv2doaIjg4GBIpVLW33DLli1DFnlobW2FXC5HYGBgv6n73qMgFEWpfPykPzQdZJg0I0EQSkvUMc+9tnVrKsqGDRtgaWkJAHjuueeQlpY27E5PzAaMi4DZWyGMpmm1biaHM7t27cL777/P/nkoKB0whUKhMpfQKGZmZpg7dy77d29vb8yfP1+jCjlcQ1EUZs+ePWDAZNKfTC1ILpfjwoULyM7O5iT9TNM0Zs+ejZycHNy/fx9AT4skFxeXIY2CqIKWlhZkZGSoPch0TzNyKVFH07RWdGsqCpP+JwgCvr6+7Nfb2tpw4sQJre4b6AuZTIbXXnsNp0+fHtLpj0nFSyQSAA//PblWCPsj8M033+D8+fMQCoVDLlEMOWCuWLECX3zxBWpqarBs2TK1SFhxQW9/w7S0NHh7ewMArly58kQFS+ChvY2xsXG/MmkODg6QSqVs+jMhIQGHDx/mPNUeGBiI9957D++//z6+++47pKen97BI0raUN0VRCAsLU3mQYZo0SJKEQCAARVGcfxhqultTUborQT148AAymQzLly/HBx98gHHjxuH48ePDLlgCD6XZysrK4OPjg9TUVIV+h2lyIwgC1tbWSEpKwsGDB1FcXKzi1T7ZKPr898eQumRFIhGKi4uhq6sL4OF4xsKFC5VaiCrpy4iaoih2eDksLAwrV67EqVOncPjwYU0vl3OeeeYZTJkyBTExMTh+/DiMjIwgkUgglUphYGAAiqJAUZRKP0xv3boFT09PAA9PcEuWLIFMJtOIlrAiCIVCvPPOO/j111/ZEzFX6OnpsXVJpkmDoiiVmiaru1tTUSwsLFiHmsd1dXp4eGDWrFn44YcfNLRS5QgJCYGPj89jjaV1dHTg4+MDgiBY8XeaptXuFsPDcZdsZ2cnWlpa2ICpreohlpaWCAkJgVQqRV1dXY8Zwe5cvHgRenp6kEqlGlqp6hAKhfjb3/4GLy8v/OlPf8LChQuRk5ODtLQ0REZGqtRKzczMDBKJhG3SYMjLyxu09ZS66ezsRGJiIkiSRFRUlNLX6z487u3tjdzcXFy/fh0ZGRlqadKgaRrLli3TioDJNDIRBAEbGxskJycPWJfMycmBkZHRYwXltRlGKq8vI2M3N7ceKmk0Tasky8OjPEMOmCtXrsQ333yDBw8e4J133uF6XUOGqYuNHj0adnZ2kMlk2L59+4BvskuXLmHChAlwcnIalmmf/vD394eXlxf7d1tbW7z00ksqM89mpLcYge+UlBQcO3YMe/fuxYcffojAwEB88sknKrk311AUhRUrViA6OnrIm4ruHb+aHB5nRABcXV010jDT+/SUmZmJK1euIDMzU6ENQ3dTgXPnzqlhxdzS1taG4OBg3LhxA8ePH8cvv/zCmjK0t7eDpulho5L2R2bINczLly/jgw8+QGNjo8bz6jo6OhgxYgSCg4NZibSbN28iLS1N4d17c3MzKioqEBERgR07dqh4xarFwsKCFVkQiUSsgSoAHDhwgPNg2duuqz+B7w0bNiA0NBQeHh6c3l9V3Lt3D83NzRg5ciRyc3MV/j1TU1P2ZM2Iv2/evJnz1O5gSUhIgFQqVVvAFAgE7OkpICBA6dMTRVF4+eWXceHChWGXonz22WcxefJkAMBf//pXODk54dSpU9i3bx/n4hs8qkOpLtn29naIxWKu1qIQBgYGsLCwgJWVFWxsbGBvbw9PT09UVFQgNTUV3377LWpra4d07evXr2PevHkcr1g9dE9z2draIikpCUePHkVhYSF++OEHzJgxA+Hh4Th79ixn9xzK6SkpKQmzZs3qMzWljTAjAQMFzN5G2P2JWmsSRgRA1cbGNjY2bFdna2srZ6eniooKVFdXsyfU4QBTrw4PD+/x9cjIyCfCNuuPhlIBs62tjfVNUwaxWAwTExMYGxvDxMSE/a+vv7e2tqKmpgaVlZWoqKhARkYGTp06xYmo8q1bt/D0009DIpFoZdevqakpxo8fj+zsbGRlZUEkErHzeo9LczU3N7OasiRJ4sKFC0qtgVGbEYvFg7bram5uRmZmJoKCgoaFnKJMJsObb76JU6dOPdLF21czmTqcMIZKbW0tioqK4O/vz7lcYm/pSJlMhj179nDufUtRFEiS1OqAyczRSiQSeHl5IScnB7/88gtMTU0xadIk3Llzhw+Ww5QhB0wXFxd8+OGHMDc3R1NT0yNuCEKhEEZGRgMGQBMTE+jo6KCurg51dXWor69n/3z37t0ef6+vr1f5B1FBQQEmTpyodQHTyMgIUVFR8PLyQmtrK7777juIRCLcu3dP4TQXTdNYuXIloqKiBnXqYYyHu1sCHT9+fMiD2BRFYfr06cMiYNbV1aGrqwufffYZjh8/juvXr7PqRxKJBHV1daBpus9mMm0kISEBISEhnARMpl+AIAi4urqqRToyKSkJM2bMgJ6enlY1xfROP5eXlz8iKrBkyRK4uLhgyZIlvBrPMGXIAfPLL78EQRAAgH379uHNN99kA6CxsTGrktI92NXW1qKqqgoFBQXs1+vq6rTqhX/x4kW89NJLEIlEWnVKmDx5Mtu8o6urCx8fH7z22muDSj/fu3cPTU1NGDFiBPLy8h77s92Hxxl/T64sgbKysvDMM8/A2tpa43W9gfDy8sL69euhq6uLlStXYtu2baitrUVCQgK2bds27OZ209LSMH/+fJiamg6pdCEQCHqIChQUFChlqTZYGhsbkZOTg6CgIMTHx6v8fgNha2vLpp9bWlpA0zR++OEHVFdX9/nzzOiQi4uLSseIeFTDkAOmoaEh+2exWIz8/HxUV1ezgbGxsXHYFeaBh4P+ra2tmDx5Mi5duqTRtZiamrISdY6OjmhqaoKBgQEA4OTJk0P6wKNpGhKJpN+A6ejoyA6PV1dXg6IonD59mtOuzs7OTshkMkilUqXSw6pGT08PCxYsYMendHR00NTUhM8//3xYvraBh30HycnJIEkSly9fVvj3HBwc2Hp1TU0NZDIZzp49q1Z/SQaKojBx4kSNBUzmfUkQBIyMjCCTybB7926F088ymQwEQfABcxgy5ID50Ucf4cCBAzAzM8Pf/vY3Tv0ONU16ejpCQkI0EjC7O6I7OjqitLQUpqamiIuLw86dOzFr1iykpqbi/PnzQ7p+YmIiPv30Uzx48ABxcXHo6urqs6tTFQP73UlISMCqVasGnR5WNUKhsIeodUVFBSorK2FlZYXGxkYcOHBg2AZLhoSEBCxZsmTAgMnM0RIEAT09PaU1hblCLpdj0aJFsLS0VInwuo6ODr744guMGzcOZ86cwcaNG2FtbQ0vLy/4+fmxTV1DnWOmaRrr16/HmTNnhv1r6Y/GkAMmTdNYtGgRQkJCHqteMRy5ePEi3n777SGnrQZLb+eBnJwc1inDwMAA27ZtY2dD09LSlLrXsmXL8Pzzz+P5559HTEwMzp07x34AqFPHtaysDPX19Rg1ahSys7NVfr+B6G62yzikMK4sR44cQXh4OPz8/JCVlaXppSrN49KCTFcnQRDsHO3x48dRWFioNRubjo4OVlRCFUIMq1evxurVqwEAPj4+cHV1RX5+PrKysnDjxg3I5XKlyhJVVVW4f/8+vL29kZ6eztWyedSA0mMlw92tpC8qKytRV1eHsLCwfo1rucDNzQ0SiQSBgYGs88DJkycREhKC8PBwXL58GdevX+dsF6qjo4MVK1awf58yZQo++eQT7Nq1SyP1WoqiIJVKNRYwuysRiUQi0DTdZ8dveXk59u3bhw0bNsDd3R05OTkaWS+XtLe34+eff0ZUVBR++eUXVoWIsYr6/fff1aZCNBS49Jm0sLCAp6cnvLy82Hnu7sTExODQoUNK36c7zLgSHzCHF0oFzI6ODohESl1Ca5HJZAgJCeE8YNrY2EAikfRQ+GDEtu3t7bFmzRrU19fjxx9/5EyAu7sLRvdrJiUlabQbODExEeHh4RCLxWoTXmc6fhklouTkZBw7dkyhjl9mpGG4B0wnJye888470NPTw/jx4zFp0iRcvHhxWFlF3b17F+3t7RgxYgTy8/MH/fsODg4IDAyEv78/DA0NkZWVhZSUFJw+fRptbW3Ys2cPJkyYgNTUVBw5coTz9ScnJ2P27NnQ19dX2o2GR30ofcJ8UgNmTEwMJk6cCEdHR6WVOHrPqCUmJj6i8BEaGoqIiAicO3cOCQkJyi6fnZeUSqUQCoWsC8bnn3+OVatWYdasWfjnP/+p9H2UoaGhAUVFRfD19UVSUpLK7tNXx29fSkQDIZPJMH36dOjq6qpMWlDVmJiYYPbs2dDT02O/VlhYiM2bN2twVUMjISEBJEkqHDCNjIwQEhKCkJAQ6OjoIDk5GYcPH8bdu3cfSTc/88wzCAkJwYIFC1RSZ2xqakJ2djYCAgJw584dzq/Poxr4lGw/NDc34/79+wgPDx+S2aiuri47o+bi4tLvjJqJiQnmzZsHa2trbNq0SalGG7FYzOq4Ojk5ITk5GUePHn3k9LRlyxbk5OTA3d2drZVqisTERAQHB6skYHbv7OSi47e+vh75+fkICAgARVEcr1Z19PYdzcjIwJ07dxASEoL6+nps27ZN00scEjRN44033sCpU6ceu/FxcnLChAkT4OPjg5SUFBw+fFghecA7d+5gwYIFIElSJf/eNE1j/PjxfMAcRvAnzMdw8+ZNzJw5U+GfZxwpJBIJfHx8kJ+f36/Xo0gkwsSJEzFhwgTEx8fj0KFDCp92nJyc8M9//hNCoRCffvophEIhSJJk/SXj4+MHrEvKZDKt6NRLTU3FvHnzOEtNmZiYsEpE+vr6nHf8UhSF0NBQrQ+YAoEAI0eO7PG6uHPnDnbv3o329nYcOXIEgYGBePbZZ7Wi6Woo1NXVobi4GH5+fn1uuNzc3BAWFgYbGxtcv34dp06dGnS6mREyUcW/d0ZGBhYtWgRzc/N+5zZ5tAu+hvkYbty4gTlz5sDd3f2xWqLOzs4gCAJBQUGspuqZM2f6VH4Ri8UICgpCWFgYiouL8dNPPw26NX7r1q0YM2YMAGDcuHH49ddfQVEUzp8/r/BcXFVVFSorK+Hp6Qm5XD6o+3NJc3MzcnJy4O/vP+RUdPcTlLOzM1JTU3Hq1CmVdPymp6djwYIFMDMz00pnCWtra5AkCYIg0NzcDIqicOHChUd8Rzs6OiCTyRAcHAx/f3/QNK2hFSsHIyjfPWDa2dlh1qxZsLW1RUxMDCiKGvKm8NKlSyoTMuno6EBycjIkEsmgZmJ5NAd/wnwMnZ2dqKiowOzZs7F58+Yep0QrKyt2Rq2rq+uxmqoCgQDu7u4gSRJ+fn4oKCjAoUOHBlTb0dPTg62tLezs7GBnZwd7e3s4OTnB19eX/RmxWIzvvvtuSI+PpmkQBKHRgAk8TMuGhIQMKmAyOq4EQbDPafcTlKpgBv8JgtCaDzkjIyO2Rm5mZobExESFB+lpmkZISMiwDZhpaWlYsGABTExMUF9fj6lTp2LcuHGIjY3Fnj17lO7yZYRMpkyZopIRFmY8T1teSzyPh69hPgaBQIDp06dj3LhxWLduHVavXs26UlhaWiIpKQm//fZbv/ZmNjY27G6/oaEBFEXh3LlzqK+vh0AggK2tLRwdHeHo6AgLCwuYmZnBzMwM+vr6bOfo/fv30djYCCMjI1hZWSE/Px/ff/89/vGPf0AgEODTTz8d8uNLSkrCzJkzNd7Ekp6ejoULF8LIyGhAPVZbW1v2OWV0XJnnVF1QFIXFixdr9ENOJBLB19cXJElixIgRyMjIQFRUFHJycgZ1mmKeexMTk0dOocOBjo4OSKVSxMfHQy6X49y5c/j+++85nZ/OyMiAVCpVScAsKCiASCTipLmQR/UoFTAZ9QtlXdDNzMzwzTffwMXFBd9++63SBrECgQAikQhisfiR//f1tb5+RiwWw8PDA+PGjQPwsIHkP//5D3755RdcunQJ2dnZfX4wmZiYsIPfZmZmoGkaO3bsQFlZGYyNjeHt7Q1vb294eHigoaEBJSUlKCkpQVFREWpqalBTU4Pm5maYmpqCJEmQJImuri7Ex8cjMTGRbVjZunUrBAKBUmnBxsZG5OXlabyJpa2tDXK5HIGBgbh58+Yj32e6jEmShLGxMWia1qiOa2FhIYRCIZydndXqBSsQCDBixAi2Lnn37l3QNK2Ux2lbWxtSU1MRHByMa9eucbxi1fPMM89gwoQJAB5upnbs2MG52Eh0dLRKhUxkMhlIkuQD5jBgyAHT1dUV0dHRsLKywrhx4zBt2jQUFRVBIBBAR0cHOjo6EIlEEIlEff65+8+8/fbbmD9/PgBg586deP3111FfX4+urq4+g99AAVAoFKKjowNtbW1oa2tDe3v7I39+3P8ZV5TW1la0tbWxnp+RkZE4ceJEj+dBIBDA2dkZnp6e8PX1hZWVFeRyOaKiopCdnQ1TU1MEBQVh4cKFsLOzQ3Z2NjIyMnD69OlHdvT6+voICgqCVCqFhYUFZDIZtm/f3udmhKs3LpOS03QTS2JiIlauXAl9fX1cvnwZIpEIfn5+IEkSbm5uSEtLw9mzZ4ckRaYKmHS2KgJmQEAAQkNDce3aNWRmZrL+kgRBoKWlBRRFKeX72huapjF79uxhFTBFIhH8/f0xbdq0Hl8XCASc34sRMomIiFDJTCZN01i7di3Onj3LS+VpOUMOmNOmTYOVlRWAh/W8//3vf5DL5dDR0UFbWxs6OjrQ3t7e7/+ZP3d0dMDJyYm9rlgsRmBgIJqbmyEWi6Gjo4PW1la0tLSgrq4ODx48QFlZGcrLy1FeXo7W1tY+gx5XvPjii3j77bfR0dGBn3/+mX28Hh4e8PT0hLu7O2pra5GVlYXz588jLy+Pbex55ZVXYGtri7S0NMTExCAnJ+eRmopAIICnpydIkoS3tzeysrIQExODrKwstbx5mJScsbGxRoS0GRYuXIhXXnkFr7zyCuLi4kDTNIqLi0FRFPbt26c2YQNFoWka69atQ2RkJKf/TkFBQbhw4QL09PTQ1NSETZs2sVJwgxH4Hgy5ubkwNjaGra2tVrqv2NjY4LXXXkNLSwv27t2LoKAgSCQS3L17F/Hx8fDx8cHIkSORnJyMkydPqmQNNE0jNDRUJQHz/v37ePDgwbAyxv6jMuSAKZPJ2KaftrY2fP7556BpekhF9tu3b+Pw4cNwcHDA//73P2zcuJH9no6ODgwMDGBkZARra2u2CcbX1xdmZmYoLi5GYWEhSkpKcO/ePU7FmPX09CCTyfD2229jyZIlWL58Oezt7SEQCJCTk4PU1FScPHkSdXV1MDQ0hJeXF5YuXcrKi/Vl5sxgY2MDqVQKgiBYu6iTJ0+qXWWlra0NaWlpkEgkGjthiEQiLF26lP376NGj8eKLL2plFypDVVUVqqqqOO0yFolEWLx4MSsqYGBggJqaGvz4448q3TwxTWsEQWiVe4xQKIS9vT0OHToEPz8/AMDTTz+NDz/8ED/++CM8PT0xYcIEzJo1C4aGhli/fr1KTpgAEBsbi0mTJqksDc9kLPiAqd0oFTCffvpp/Pvf/8bHH3+s1PCtXC5HUFAQdHR0HgkuHR0dqK+vR319PcrKypCamsp+z8DAAC4uLnBzcwNJknBwcICxsTGqq6vx4MED1NfXo6mpqcd/ra2tbEpPKBRCV1cXenp6MDQ0ZA2vzc3NYWlpCR0dHfaDsbGxERYWFti6dSvu378PoVAIV1dXjB07Fh4eHrCzs0NOTg4yMjJw8uTJPofjDQwM2JSrubk5KIrSCk9FmqYxc+ZMtQdM5t8tICAAZWVlcHFxAQDcunVLq4MlAyOVp2zA7P48tLS0oKWlBXp6emhsbMTJkyfVkmkYqrk41xgYGMDPzw/+/v5wd3dHdXU1Ro0axX7fxMQEb775JpydnSGTyfDXv/4Vzc3NaG5uRkVFBby9vZU2KOgL5vrh4eHYsWMH59dPSkpCRESExhvweB6PUk0/N2/exLVr1zhrSR/s6bSpqQmZmZk9dmVisRjm5uawsLCAkZERDA0NYWBgAEtLSxgYGPSQBGPqnC0tLWhsbER5eTlyc3Px4MEDPHjwgO3YFAqFmDhxIiIiIiCVSuHm5gYnJydUVFQgOzsbUVFRKCgo6DMVzIgZSKVSeHl5QS6X4+LFi/02DWmCnJwcmJqawsbGRuXWTZaWliAIAiRJor29HRRF4bvvvsMXX3yBlStXYsqUKfjiiy9UugauSE5OxqxZs6CnpzdoE3RLS0u225d5Hr7//nvU1NTgyJEjWLNmDYRCoUIat1xQWlqK5uZmhczFuUZHRwc+Pj4gCAIeHh7IyclBUlISjhw5AicnJ8ycOROhoaHo7OxEZ2cnQkNDATxs8ukeXJiZTFUETAD4/fffMWfOHJVcu6GhYViqSP3RUHqIsntTjDbQ1taGioqKx37wi8Vi6OvrQ1dXF0KhEEKhEGKxGKampjAzM4OTkxM74mFubs52xwkEAtjb2yM2NhZFRUWPVaaxtbVlU67V1dVISEjQWmHr7im5qKgozq+vp6eHoKAgkCQJGxsbJCYmYv/+/axlGcOWLVuQlpYGLy8vlWrLckVjYyNycnIQEBCg0AypgYEBK/xuZWWFpKSkPp8HuVyOf/7zn/jXv/4FBwcHldQt+2Igc3GucXV1ZQU/ysrKQNM0jhw5wr6vPD09sXTpUqxfvx6zZs2Cu7s7goOD4ejoCODhZtTX15f14k1OTsacOXNgaGjIqeE5w+3btzFv3jwEBwcjMTGR8+trSwMeT/8oHTBbW1tZR3ptwdraGk5OTrCzs4OlpSVMTExgZGQEIyMjGBgYoLOzE83NzWhtbWV3re3t7aitrWVHO8rLy1FTU8Omdzs7O7Fq1SpYWVn164loaGjIjj+YmpqCoiitMNxVBJqm8cILLyA6OpqTlBwjeC6VSuHt7T1gTZchOTkZ06dP7zM9r43QNI2nnnqq34DZ3evU09MTWVlZuHz5MjIzMx+bYeiuZbx7925VLb8HiYmJ2LBhA06fPq0y8Qcmw0AQBDo7O0HTdJ/OPK6urli6dCn279+P6dOn48GDB3j//fexbt06WFlZQU9PD9u2bcPYsWMRHByMY8eOobKyEhkZGZBIJPj99985X3tnZyeKioowceJElQTM5uZmvP7661i+fDnee++9PkeseDQLJwFT0ydMKysreHp6wtPTE25ubmhra0NRURHKy8uRkZGBuro61NfXo7GxEY2NjUP+ID5//jw+/fRTLFu2DKdPn0ZDQwOEQiG8vb1BkiQ8PT3ZAfLs7GytGH9QlHv37qG1tRWurq5KpQF7C54zzUyK7vhra2tRWloKLy+vYeEVmJ6ejkWLFj1iM8XIJQYHB6OiogIUReHYsWOD0ssdrJaxstTU1KC0tJQVKecKQ0NDdjbZ2toaiYmJAwp+vPDCCzh8+DDGjBmD+vp6/Pbbb5gzZw7q6uoQEhLCvocFAgHGjx+PdevW4dixY0hISMDMmTNVEjCBh80/K1euhFAo5Lyk8tVXX8HZ2RnOzs7Yvn072+jEoz1wkpLl6oRpaWmJBw8eDBho9PT02LEOLy8v6OjoICsrC0lJSTh58qRKhouBh4bLCxYswIIFC7BhwwZ89dVX8PPzQ2VlJSiKwtGjR4e1tx3TqTfYgGlsbMwaMRsYGCgteM44mAyHgGlpaYklS5bg9ddfx/Xr1/Hdd98hKCgIQqEQNE3j559/HnLnNqNl7Ofnp7K6XG+Y14CyAVNXVxd+fn6QSCRwc3ODXC5HXFwc5HL5YwONqakpVq9ejXPnzsHd3R2mpqbYtm0bxo0bB09PT3bMhqGrqwvXrl1Dfn4+XnjhBVy6dAkmJiZKi6n0h1wuR3t7OyZOnIi4uDhOrikWixESEtKjucnIyIiTa3PNmDFjIBAI/rCnX6UC5siRIzFv3jx4e3vj/fffH3J9zsjICCdOnIBUKoVMJsP8+fPZoX4DAwPY2trC3t4eDg4OcHNzg6WlJQoKCpCZmYnff/9doS5TgUAAgUDA1ix7/6ejo8N2zPb+T1dXF6ampli7di17PR8fHwiFQmzevJkzJwxNI5PJ2JTcQKfw3sICqampOHPmDPLy8pQ+WaekpGDmzJlqNZYeKitWrGBrauPHj0dCQgK2b9+ukH3UQDApwKlTp6otYCYnJ2Pu3LlDqgPq6OjA29sbwcHB8Pb2Rl5eHmiaxv79+xXq/DQwMMDq1atx48YNNuD+8ssvCAgIwMSJE/HLL7/0+xlTXFyMzZs345VXXsG9e/dAkqTSimH9kZmZidDQUKUDppGREZ566imMHTsWBQUFeP/99/H555/DwsICH330ETeL5YBRo0Zh6tSpWLJkCUJCQgAAP/30Ez788EMNr0z9KBUwjx8/DldXV4wbNw6mpqb47LPP+lT0eZzaj0gkwvjx4yGVSgEAEokEO3bsQHp6OqtTy4gTMMIEDx48gJmZGcaMGYOnnnqq3yDI/McEyo6ODrZm2dd/jEBCX/9VVVXh0qVLCAoKAvBQHu3UqVNa/4E+GGpqalBWVvbY1nxGmi0gIEBlwgKMsbSPjw+Sk5M5uy5XMIFBIpFg9OjRPb536tQpToIlQ2xsLFasWKGSFGBftLS0sDKFt27dGvDnGWMBiUQCPz8/lJWVQSaTDSoNDzzcgK1YsQLZ2dmoqKjAwoULsWnTJjg5OWHOnDnYunXrgKNGVVVV2LJlC9atWwdXV1dcuHBBJc9ZdHQ0Xn/99SE3F1laWmLixImQSCRISkrq4YN78uRJzJ07d9Bd11zj5OSEadOmwdPTEyKRCGVlZXB3d2e//+yzz/IBczDo6+vD1dWV/TtBEJg6dWqfSj7d/97e3s6OcTB/z8jI6HHtq1ev4vLly2hubmZVgzo7O9HV1fXYgMf819XVhY6Ojh4/z0U98dq1a6AoCs8++ywyMzOfqGDJQNM0wsLCUFNTw3Zv9h6BSEhI4FSarS+YtKy2BEyBQAA3NzcQBMHOjdI0jVWrVuG1117DmDFjcOLECc47HDMyMtDe3o4JEybgypUrnF67P2QyGSZPnvzYgGlpaQmpVAqpVIrGxkbQNI2LFy8OaX5WIBBg2bJlqKmpYZ/TnTt3wtDQEEuXLsWePXsUTq9WVlYiKioKu3fvxiuvvIKff/65hxAKF5SVlaGhoQHh4eGDUhZydnbGpEmTMGrUKNy6dQvffPNNn+paFEVh+fLluHjxolr7IKysrBAWFgYfHx/o6+ujsrISly5dwvXr19He3o4ZM2Zg7Nix7Br/iAw5YDY3N2PHjh1YtWoV2tvb8Z///GfIslS3b9+Gjo4OwsLCcPnyZfz4449DXZbKiYyMRGpqKtauXftEDhlPnjwZ7733Hv75z3/ip59+QklJyWNHQVQFYyw9lBlHLrG1tQVBEJBIJGhpaQFN0+y8JMOXX36p0jVkZWVhzJgxaguYcrkczzzzDCwtLXvUX3V1dREYGAipVApbW1vIZDLs2rVL6bGX+fPnQ09PD+fPn8crr7zCNke98sorOHr06KBr6gsXLoStrS0A4O2338aRI0c4V9BJSkpCUFCQQp953t7emDRpEqysrHD16lUcOXLksZ8bJSUlaG1tVctMrLGxMcLCwhAQEAAjIyNUV1fj5s2biI2N7bHG0aNH4+rVq4iJiUFLSwu2bdum0nVpK0qlZN966y0UFBRALpcrLam1adMmbNq0SalrqIv8/Hy0tLRg6tSpWiUlpiwCgQDr168H8HAsZNmyZViwYMGAjRqqoLm5GdnZ2QgMDFRKRWoomJiYsF6nRkZGkMlkKtNxVYSoqCilUoCDRSQSYcqUKVi3bh3OnTuHzz//HBKJBP7+/sjPz8f169eRkZHBydjPtGnT4OLigt27d2PNmjW4fPkyioqK8OqrryI6OnpIjV/dN1idnZ0q2XBdvHgRTz31VL/NRTo6OggODsakSZPQ1dWFuLg4JCUlKfw+SkhIAEmSKgmY+vr6mDp1KiQSCUxNTVFfX4+kpCTExMT0eeL19/dHeHg4Nm/e3Kff7x8Jpbtk7969y6l+63AhNTUVJEk+EQGz+ymqoaEB5ubmAB6mRTXZqZqQkIBJkyapJWDq6urC398fBEHAxcUFqampiIyM1Ap3FCYFGBYWhlOnTqn8fkuWLAFJkgCARYsWobOzE3v37sWFCxc49cwcPXo0pFIpfv31VyxduhRyuRwJCQlYu3YtEhISEB8fP6Tr/ve//8XIkSMhlUoRGRmpErWkxsZGVFVVISIiAnv27GG/rqenh9DQUIwfPx4VFRWIjIzsd277cchkMrzxxhuc9UmIRCJMnDgRISEhsLS0RHNzM9LS0nDx4sVHZmC7M3LkSCxcuBA7duz4wwdLgIOA2dnZqTLBY23mwoULrGLLcHwhmZqaIjg4uMcpateuXdi9ezfefvttSCQSvPvuuxpdo1wux6JFi1T2HAsEAnh4eIAgCPj6+qKgoAAJCQnYs2eP1tWnmRSgOgJm7xPZiRMnOE8H+/n5ITw8HL/++itmzZqFhoYGXLhwAStXrkRhYSFiYmKGfO3a2lqsXLkSL774Ir744gssW7YMa9as4dwA+tatW1ixYgXy8/Mhk8kwfvx4jB49GllZWdi9e7dS/pZ1dXUoKiqCn5+fUiIJBEFg4sSJsLe3R1tbG7KysrB3716FsiUODg7405/+hAMHDqitFKPtKB0wGc/KPxq1tbWorq7GjBkzsH//fk0vRyH09PQQEBAAgiDg6OjY7yjIW2+9hblz52LUqFHIycnR2Ho7OztZc93o6GjOrmtvb8+qzdTW1oKmaZw9e1aj9mYDMVAKkEuOHj2K0NBQzJo1C0lJSTh79iyn13dzc8OiRYuwY8cO1vt169atWLx4MVpbWzmz6HrnnXdYz9xPPvmE84A5efJkLFq0CIsWLQJN0/j222/7VC0aKoy4/2ADpqurK8LCwuDu7g6BQICCggJs27ZtUO9lS0tLvPjiizh58qRGPwO0DT5gKsGtW7ceMbDVNrqPQHh5eSEnJwc3b95kuy/7Iz4+HqtXr+ZMKm+oUBSFlStXKt0xyNQlSZKEvr4+ZDLZsJEtBB6mACsrKx9JAaqCzs5O/O1vf8Pnn3+OV199ldORFltbWyxfvhwHDx6Ek5MTAgIC8MsvvyA8PBzm5ubYunUrZ6+3mpoatvlHFR3d3S3pRowYgdOnT3N6/bS0NCxYsAAmJiYDpsLNzc0RHh4OPz8/6Ovro7y8HKdOnWJ1dgeDsbExVq9ejZiYGK3pUtcWOAmYQqGQi7UMO65cuYKIiAj4+Pg8MhqjSQQCAStsHRgYiPLyctA0PSjx97KyMtTW1sLT01OjHn337t1DY2Mj3N3dB73T7V6XdHZ2RmpqKk6fPs2JuIImuHXrFsLDw9V2v8rKSk6Njc3MzLB69WpERkZCKBQiLCwMmzdvZs3TN23axKmG7Zo1a/DDDz9wKgRgaGiIoKAgjB49GtXV1axohSrq7G1tbUhJSYFEIsHVq1cf+b6uri6mTJkCkiRhZmaG2tpa3Lp1CzExMUPu3tfT08OqVasgk8kUmsP9o8HXMJWgs7MTxcXFmDZtmlYETFtbW7a7kxmB+OGHH1BdXT2k6925cwchISEaN7VlbJsUCZi965L5+fm4c+cOdu/erTJBcXVx/fp1zJo1C76+vmprxqIoihNjY0bF5/r16ygvL8fq1auxe/duODs7Y8KECY9V8RkqKSkp+Pvf/47Q0FA4ODgM+TqMXrRUKoWHhwcyMjJw/vx5bNmyBWvXrkVEREQPFTAuoSiK7ZBmvEpDQkIwYcIE2NnZoaWlBWlpaYiOjlY6FcyIRxQVFXGevn5S4FOySnLp0iWViTErApNqlEgkMDY25nQEIjExETNnzlTbOEN/yGQyhIWFPVYqz8HBge30ZQbgIyMjWU/TJ4HOzk7cvXsXU6dOVVvATE5OxowZM5SaOWY+iDMzM5GcnIx169bh+PHjEIvFmDdvHrZs2aIyw3ADAwMUFxdDIpHg7NmzgwrKjo6OrJFAZWUlEhISetiPAcB3330Ha2truLm5DXlj+jhWrFiBF154AS+88ALu3LmD+Ph4dHV1IS8vDydOnOgh+K8MQqEQS5cuZU3LefqGT8kqiVwuR0dHB0JDQ9UmSMw070gkEjg5OSE1NRVnz57lfASiublZpXZJisJI5YWEhODmzZvsYzQ1NWVP1Pr6+qBpeljVJYdCXFwcnnvuObVt0JQ1NhYKhXjuuedQXV2NmJgYvPrqq7hy5QqqqqqwZs0a7N+/X6VNTLa2tigsLISenh5CQkL6TG12x9jYmDU419fXB0VR2LRp02O7tCsqKjB27FiVWH7NnTuX/XNgYCDeeecdlajsLFy4EPr6+ti5c+ewLFeoCz4lywGFhYWQSqUqDZiMr6JEIoG3tzdycnJw+/ZtpKenqzTVeOfOHcyZM0ejAVMgEGDu3Ln4+uuvUVBQgHfffRdOTk7sZuHUqVPIz8//Q7zRU1JS0NnZidGjR6utxqSMsfH8+fOhq6uLgwcPYuXKlcjKykJaWhpeffVVnDx5Erm5uSpY8f/h4eGBuLg4lJSU4LnnnsO1a9ceeZ0IhUL4+PggJCQEI0eOHHSt++LFi1i+fDlEIhHn78Vbt26xLiZXrlxRSbCcPXs27OzssHXr1mHhQatJ+JQsB9y8eRPLli1TybW765dWVFSApmmcOHGC83pPf+Tm5sLAwACOjo5KzZUpQ2hoKKZMmQLg4fPx0ksv4d///rfKNwvaSl5eHp566im1Bcy0tDQsXLhQoW7N7oSFhcHJyQm//vorFixYgKamJsTGxmLt2rWIi4tTeQfmqFGj0NzczGYcTExM8PHHH+PcuXO4fv06rK2tERISApIkUVVVhfj4ePz222+DTj2npaWhra0NU6dO5XT8CQBef/11xMfHQ1dXF3v37uX02sBDy0IvLy9s3rz5iZP5VAV8SpYDkpOTsWzZMs58C21sbFjz4fb2dtA0jZ9++omz+a7B0NXVxTbdqDtgMvOS06ZNQ2dnJ/s6u3z58h+63T02NhYvv/yySk40fdHe3o7U1FQEBwfj2rVrCv3OmDFjIJFIsGnTJkyePBnW1tbYuXMnVq5cibS0NJVnLAQCAWbOnMkKLri6umL16tUwNDTEq6++ip07d+LBgwegKIqTNH5ycjJCQ0M5D5jt7e3YtWsXp9dkGDNmDEaPHo1NmzapbQM+3OFPmBxRWlqKp556asgB08TEBMHBway+o0wmw759+zR2qusORVFYv349zp49q/KUTXczakNDQ9A0jS+//BI3b97En/70J6Smpg4bzWFVkZeXh7a2NkycOBGxsbFquSdN05g9e7ZCAdPPzw/Tp0/Hpk2b4Ovri+DgYGzatAmLFy9GZWUlzp8/r/L1hoWFobm5GRRFwcTEBAsXLoShoSGAhynYtrY2fPbZZ5zVgW/fvo333nsPERER+PTTTxEVFcXJdbmGUVcSi8WIiorC22+/zanc4ZMOHzA5gqIozJgxY1C/o6uryzbvMPql586d0wr90u5UVVWhoqLisT6ZyiAWi1kzaldX1z4ViI4ePYqjR49yfu/hSmZmJkJCQtQWMHNzc2FsbAxbW9vHGra7uLiwKj4uLi4ICwvDr7/+iunTp0MsFmPfvn0qWZ+trS3ef/99iMViREdHw9vbG7du3cLatWthb2+PkpISVFZWwsrKCk1NTfjtt984bZp65513MGLECADA9u3b4eXlpdHO8v7YuHEjzMzMAABjx479Q+qAKwMnTT+M0fMfmVu3bmHOnDkYOXLkYx0GhEIhvLy8QBAEvLy8kJeXh/j4eK2fE2RkurgKmAKBACNHjgRJkvD390dhYSEoisLevXu1TsdVG7l48SJef/116Ovr9xhzUBVdXV2QyWQgCKJfwwEzMzMsX74cR44cgZWVFV5//XWEhYVh/fr1OHHiBN5++23OMhRWVlaQSqVITU3F3bt38fPPP7OqW2FhYdi3bx+srKwQFxeHrKwsdHR04OTJkxg3bhySk5M5l3szMTFh/6yvrw+xWMzp9bmi+2mSf58NHv6EyRHt7e0oLS1FWFgYtmzZ8sj3uyvv3L9/HzRND9qVXpMkJSVhzpw5Ss9kMvVZgiDQ1NQEmqY5d8H4I1BWVoampiZMnz4dkZGRarknTdN48cUX2QH67ujo6GD58uW4fv06jIyMWLNhIyMjAMBTTz3Fmc2WjY0NYmNj4ejoiLq6Onz00UcICgpiv6+rq4tPPvnkkeBcXl6OEydOcLKG3nz22WcICgqCra0tPv30U5XNlSrL+vXr8fnnn0NPTw+JiYmYM2cOzp49q1UZLW2Gb/oZgPXr1+NPf/oTkpKS8MYbbzx2N5+SkoIPP/wQLi4u+O9//wuRSMQO03d0dGi0eUdZWlpakJGRgaCgoEGPzxgaGiI4OJiV8KJpGrt27UJpaamKVvvHgGnEUVfALC0tRVNTU5/GxnPmzEFNTQ0MDQ0xZswYbNmyBc888wz7fa4CiJ6eHp5//nlWks7ExARSqRTffvst/vWvf0FHRwdffvml2scj0tLSEBwcrNZ7DoWMjAwsWLAAwENRhxUrVmDp0qX4f+3dd1iUV/r4//cw1AFGaaKIgIWAiogYxdUYsbeIirFDFNSgRlescTfZbPnku4nJKmqKggaDiBpLXDXGHqNGExtW7BUUpEov0n5/+HNWEgvIDM37dV1cPDPzzLnPJMjN85xz7rNx40ZZUlIOdXodplKpRF9fH319fc2xnp4eSqXymV9Pvu7s7MzHH38MQMuWLSkoKOD7778v8wdCcXExDx8+pKCggA8//JC2bdvStm1b+vTpw/bt2zl79ixr166tE9vjREdH07t373IlTH19fVxdXfH09KRp06ZcvnyZPXv2cOPGjWqpiFQX7d27l9dffx0LC4sq+yPs9OnTtGvXrkzCbNmyJS1btiQxMREHBwe++uorLCws+OWXXzAyMuLWrVvMnTv3pWM2aNAAV1dXXF1dadKkCfXr16eoqAh9fX1KSkpYt24dR44cYf369ejr6z93jFX8T15eHt988w2jRo0iICCAyMhInWy2XZdUOmECZZLM4wT1ZJJ68vGzznlacvv9uc9q81mvFRcXU1RURFFRkea4uLiY4uJiSkpKKCoqoqSkRPPck18lJSU4OjqW+Zzm5uaYmppSWlqquYWhr6+PoaEhRkZGtGjRQnOumZmZVmfh1QTXrl3j7bfffu7ED0dHRzw9PXFzcyMhIYHTp0+/1No28WKZmZlkZmbSq1cvNm7cWCUxz5w5Q3BwMNu2baOoqAiVSsXw4cMpLi4mJSWFnTt34ujoyJgxYwgLCyM7O5uPPvqoQlcvBgYGtGjRAhcXF1xcXIBHE88aNGjArVu32Lt3L99++y29evXi2LFjHDlyRHOOqJiioiKioqLw8fEhKCiIVatWyfDIc1Q6Yebm5jJgwAA6d+78h+T0rOMnn3vaOQ8fPqzw+57Wjjbuy9vY2DB27FjOnz/P3Llzn/uPsnHjxnzwwQcALF++vE4lS/jfxI+RI0eyfft2TR1LKysrPD098fDwoKioiOjoaJYuXVpjx3HqktOnT+Pl5VVl8TIzM4mPj8fV1ZXExEQCAwNRKpWsX7+eq1ev4ubmxpAhQ1i7di03b97k9u3beHh4cOrUKU0b+vr6NG3alHv37mnGw83NzWnTpg2urq44OjoSFxfH1atXOX78OK+//jolJSVERkZy584dAOLi4sq0KcrP3NycgoICzR+xpaWlbN26FW9vb6ZMmUJ4eDgpKSnV3MuaSfG8pGJpaVmujKNQKGTQ+P/XokUL3nvvPXbu3Flj12JVxoYNG+jVqxeFhYV8/vnn5OTkYGlpydmzZ4mOjq4R60ZfJYaGhvzzn/9k2bJlxMbG6jyenp4eAwYMYPDgwZrdehYtWkROTg5eXl707NmTb7/9VvNz0LhxYwICAtiyZQsxMTGYmJiwbds22rdvT0JCAn/9619p2LAhtra2XLp0iYsXL3Ljxg1cXV3p1asXmZmZ7N2797kzz0X5/fWvf2XOnDlkZGQwatSoP1SLev311wkMDKRDhw48fPiQP//5z6/kHyZpaWlPHWfUSsIUZY0cORInJycWLFhQ3V2plN8X+G7WrFmZff/OnTtHUFAQ165dq3NX07XJjBkzyMnJYeXKlTpp38zMDCcnJ5o1a0abNm3o3bu3ZlbqF198wd///nd69uyJp6cn33zzzR/uwjg6OjJ48GDUajU2Njb4+/trXtu2bRuffvqp5meoTZs29OrVi9zcXPbu3ftSyz8UCoVmmMTY2BhjY2PNsaGhIQqFQjPv4vHxs77Kc051nffkOYDmouVp30tLSzE2Ni7zO2nfvn2MGDHiD//9Lly4oJlUFRMTQ9euXSv8/6C2e1bC1MoYpihr3759zJkzBzMzM7Kzs6u7Oy9l1qxZvP/++yQmJjJ//nysra1p3rw5aWlpWFpaAo8+55UrV6q5p+Lw4cNlZqRWlJ6eHiqVCpVKhampKWq1mgYNGmBjY0OjRo0wMzPj9u3b3L59m9DQUIKDgzXv7dmzJ6dPn8bBwYFly5Y99ef97t277N+/Hy8vL2xtbSkuLtas3d6+fTtXrlyhdevWmjsX+/fvJz4+HmNjY1q0aPGHpPfk8bOSYmFhIfn5+eTn51NQUKA5Liws1CSQp30Bz3399+eVlJRUur0nz3n8h2dF23oygT7+/vtjfX19srKyNGtGnzUP4cn14LLGviy5wtSRDz74gAsXLtS6veWMjIxwdXUtU0Hm/PnzzJ49m7Nnz9K4cWMmTJhAfHw8YWFhMhW9hvj444/Zvn07x48fL5P8fv/98fGTjw0NDcnLyyMnJ4fc3FwyMzNJTk4mKSmJxMREkpKSygy5/Pzzz5orzMLCQr766isWLlyIQqEok7gaNWrEa6+9hqOjIzk5OSQlJZGdnY2npycdOnQgPj6eixcvYm5urpl5XlRU9IdE9/vvLzouKCiQIaJn8PLyYtasWSQlJfHhhx8+dZ7Bm2++yeLFiykuLmbatGlVVuS/JpFbslXMx8cHd3d3zbKUmkhfX59mzZphb29P48aNsbOzw9TUlPT0dObNm4ehoSEAkZGRzJgxo5p7W/cMGDCAf/3rX6SnpzNlyhSuXbtW5nWFQoGJiclzk93j44YNG2JgYEBpaSn5+fnk5uaSn59PXl6eJok8Xv5UVFTEw4cPNZPjHlfrKs/sc2NjY7p27apZyweP/qA6dOiQJmEBmJqaolQqSUlJISEhgYyMjDLJzcbGRpN0Dx06RExMDAUFBXJrX9QIkjCrmEql4m9/+xuLFi2qcRsaN27cmNdffx13d3eSkpKIjY3l3r173Lt3j7S0NEpLS+nXrx+zZ8/m3r17zJo1S6bsa5menh537tzRVMK5fv06GzduxMDAQPOlVCo1Ce3xF/xvbEqhUKCnp6f5etZSqvLMKC/vax07dsTY2JgPPvhA8wfVX/7yF0JDQ2nUqJFm/8sDBw4QExPzhwT42muv0bt3b/T19dm3bx8XL16Uq0FR40jCrAbz5s0jLi6OdevWVXdXNDvJt2/fHgMDA06dOkV0dDTp6enV3bVXkp6eHrGxsZodNC5fvszChQs1V4W5ubnk5eVRWFhY7qVU8+fP59y5c2zbtk0nfW7ZsiWDBw8GHq15HDRoEEVFRQwbNoyuXbvStWtXdu/ezcmTJ/+QBB0cHBgwYAAmJibs27ePCxcuSKIUNZZM+qkGp06dqtYZZk/bSX7r1q3cvn1bfllVs5KSEqZPn85nn31GXl4ekydP5ty5c5Vq8+zZs3h4eOgkYZqYmODr64uenh47duwgNTWVWbNm0aBBAw4cOMD69ev54osv/jAmZmBgQN++fXF3d+fHH3/k7Nmz8rMnaq26WwS2Bjh48CBGRkY0bdq0SuM2bNiQgQMH8pe//IWuXbsSExPDJ598wqZNm8psmSWql5OTE1ZWVtjb2/PRRx9Vur29e/eiUqlo3LixFnpXlq+vL4aGhmzbto3o6GgmTJhAgwYNAGjTpg3R0dF/SJYNGzZkxowZqFQqFi9ezJkzZ+RnT9RqcoWpQ0VFRSQmJtK9e3etL7xWq9X06dOHO3fucOLECUxMTPDw8KB9+/aYmZkRHR3N8uXLSU1N1WpcoT39+vXTHPfo0YOpU6eSnp5OdnZ2ma+srCzN8fO2ZMrPzycpKYk+ffqwatWqSvfP1NSUefPm4ezsTHp6OlFRUZw9exagzNjk45/zJ7Vu3ZqhQ4dq6ikLURdIwtSxX3/9lUGDBmm1TUNDQ3788UdatWpFSUkJERERZGZmcuXKFXbt2sWNGzfkL/la4PDhw3To0AF4dPt+165dmJmZab6aNGlS5rGZmRklJSWaBJqenk5KSgqpqama70eOHMHHx0cr/fv3v/+tKTLw4MED3nvvPQDc3NwoLi7WbBIdFRWlKZMI4O7uzsCBA1m1alWd2HRAiMckYerYiRMn8PHxoU2bNpw/f14rbXp6etKqVSvg0Tilk5MTY8eOrZKNhIX2fPzxx8TExFC/fn02bNhATk7OC99jZGSEubk55ubm1K9fH2tra1xcXOjcuTPW1tbAo8XmU6dO5dq1a2WSaXnaf9KTQwkWFhaYmJjg5OTE4MGDWblyJQkJCX94j42NDT4+PnzzzTdPff1JKpUKtVpNvXr1UKvVqNVqlEqlptRmWloaSUlJxMfH1+jN1cWrQxKmjj2ut9m1a9dKJUwzMzM8PDzw9PRErVaTmJiIra0tAFu3bpVkWUtt2bKlQuc/XlP5rOLYKpWK8ePHo1arKS0txdnZmU6dOmFlZaVZF5mamqr5evz4aRV6zp07h5eXFwYGBoSFhdGoUSN8fX0JDw9/ZjL08fHhp59+Ijc3FwcHhzIJ8cnEWK9ePYqKisjIyCAjI0Oz88rjSjx6eno0bdqUTp06YWFhwdmzZzl27Ngfbv0KUZVkWUkVaNWqFX5+fnz44YcVWpitr69Pq1at8PT0xNHRkYsXLxIdHc3NmzexsbFhyJAhmu2OhHisSZMmTJ06lX/+859l/pAyMTHBysoKKysrrK2tyxzr6+uTmppKWloaOTk5NGzYELVazenTpwHIycmhV69eHD58mJSUFE05PTMzM0xNTTE3N8fKygobGxtKSkrIyckhMzNTkwx/nxgzMjKeOx77JAsLCzw9PenUqRNHjx7l559/liEHoVOyDrOa/d///R87d+7k6NGjLzzXyclJs6fk3bt3iY6OJiYmpty/YIT46KOPOHXqFDt27CjX+SYmJlhaWmJpaYmbmxstWrTgzJkzGBoaUq9ePZo2bcr9+/fJyMjQFFHIzc3VTEbKycmhbdu2pKamsnfvXp1U7FGr1YwaNYqioiIiIyPl34PQGVmHWc1u3ryJl5fXMxPm47+iPT09KSoq4tSpUyxevJjMzMwq7qmoC86dO0e7du3KnTDz8vK4d+8eFhYWODk58eWXX/LgwQNMTU2ZMmUKP/zwwwtrivbv35/9+/frrLxdZmYmK1asYMSIEYwePZo1a9ZIKT1RpWQdZhXZv38/DRo00JQTe6xZs2ZMmjSJ9957D5VKxdq1awkJCeHQoUOSLMVL27NnD6ampjRq1Kjc72natClDhgzh22+/5cGDBxgaGjJ+/HjN+OHzKJVK6tevr/MykKWlpWzatAl9fX369++v01hC/J4kzCoSGxuLnp4eH3zwAS1atMDc3JwRI0YwfPhwTpw4wSeffML27dtlGr7QitzcXFJTU+nTp0+5zre1tWXMmDGsX7+ehIQElEolfn5+xMfHl2uM3MTEpMqKpxcXF7Nu3To8PDx0UqRBiGeRW7JVxMrKimHDhmFpaUlQUBCbNm3ihx9+ICQkhIcPH1Z390QddPz4cWbOnImBgQGRkZGanUQeMzc3Jzg4mHr16pGfn8+mTZu4fv06CoWCYcOGUVRUVO7t6fLy8jAyMtLFx3hmvF27djF48GC+/vrrKosrXm1yhVlF2rdvr9l42dDQkJSUFHbt2iXJUujM+PHj6datG5999hlhYWF/eH3JkiXMnDmTwMBA+vbty5kzZ4BHFYgsLS1Zt25dua8Yi4uLycnJwcrKSpsf4bmio6M1m10LURUkYVaRmJgYsrKygEdrMw8ePFjNPRJ1XceOHTXHnTp1KvOaWq2mXbt2mseNGzfGxsaGgQMH4ubmxs6dOzEwMKhQvKtXr+Li4lK5TldAaWkpFy5cwM3Nrcpiileb3JKtIvfu3aNv37707t2b06dP88svv1R3l0Qdt23bNiZPngxAQkICU6ZMIS8vDysrK8zMzLh+/ToODg4oFArOnz/PpEmTUKlUpKSk4Ovri1qtBh797MbFxXHlyhXu3LnzzDWQFy5coHfv3uVaOqUtV65cwdvbm59++qnKYopXl6zDFKIO69GjByNGjODXX3/ll19+wcXFBWdnZ+rXr09JSQnHjh0jJSWFzMxMRo4cyYoVK0hKStK839TUFHt7exwdHXF1dUWtVnP+/Hmio6OJi4srE0uhUBAcHMwPP/zAtWvXquTzWVpaMnHiRD777LMqiSdeDVK4QIhXlIeHByNGjCApKYnc3Fzu3LmDp6cnX331FZmZmTRu3JiAgAAiIyO5c+fOc9uysLCgXbt2eHp6UlhYyMGDBzl37pxmrLNVq1b079+fJUuWVEn9V6VSyb/+9S8+/PBDqf4jtOZZCVPGMIWo4+rXr4+hoSHOzs4kJCTQoUMHVq9eTWZmJlZWVowbN47vv//+hckSHu1a8tNPP/Gf//yHnTt30qFDB2bPnq3ZDODixYvEx8czZMgQHX+qR5RKJcXFxZIsRZWQhClEHaWnp8fbb79NmzZt6NOnD6NHjyYiIoKMjAzu3buHmZkZgYGB7Nu3j4sXL1a4/atXr7JixQq2bNlC3759CQwMxNLSks2bN2Nra0vfvn118KnKMjMze2rheCF0QRKmEHWQQqHg7bffRq1Ws3//fuzt7TWvtWrVCiMjIwICAoiOjub48eOVinX9+nWWLFnC9evXmTp1Kq+99hrffvstLi4u+Pj4oFA89e6WVqjVakmYospIwhSiDhowYACWlpZERkYSGxtLamqq5rVOnToRHh5ObGws+/fv10q8kpISDh06xKpVq+jfvz9du3YlNDSURo0aMWLECPT0dPOrxtnZuczm1ULokiRMIeqYbt264ezsTEREBMXFxQwdOpTPPvuMDRs2AODo6Ej//v158OCB1mPfu3ePr776imbNmuHj48OqVaswNjbmnXfeqfC6zhdRKBRa3ZhdiBeRhClEHdK+fXu8vLwIDw8nLy+PIUOGYGBgQHh4uGZvy8fMzc110ofc3FxWrFiBSqVi7NixfPfdd+Tm5jJhwgSMjY21FsfT05OCggLu3r2rtTaFeB5JmELUES4uLvTr149Vq1aRmZlJnz59aNiwIWvWrKG4uJikpCTNTNibN2/i6uqqs1ulhYWFREZGkpmZyYQJE9ixYwd3794lKChIK4larVbTr18//vvf/8oMWVFlJGGKSunSpQtHjhzhp59+onXr1tXdnVdWkyZNGD58OKtXryY5OZnOnTvTpk0bvv32Wx4+fMgbb7yBk5MTXbp0wcbGBm9vb8zMzJg7dy76+rop+FVSUsLmzZu5evUqU6ZM4ejRo5w/f56goCBsbW1fut3H24798ssvsruPqFJSuEBUyoULF7CzswPg1KlT9O7du5p79OqxtrYmKCiIzZs3c/nyZdzd3Rk4cCDLli0jPT2ddu3a0bdvX5YtW0ZGRobmfcbGxsyePRuFQsGiRYvIzc3VWR+9vLzo2bMnERER2NraMmDAAPbv389vv/1WoStEc3Nz/Pz8uH//Plu2bNFZf8WrTQoXCJ148upEV1cq4tnMzc0JCAhg9+7dXL58mRYtWmgm26Snp/Paa68xYMAAwsPDyyRLgPz8fBYsWEBBQQHz5s3T1I7VhWPHjrF161YCAgLIyclh2bJleHh4MH369OcWbLe0tGT9+vX89ttvzJo1i2nTpnHlyhX++9//6qyvQjyLXGGKSunbty+LFy/GxMSEwMBAKYJdhYyMjAgKCuL8+fMcOHAAOzs7AgMDiYqK4tatWzRp0oRx48axevVqYmNjn9mOnp4e06dPx8rKii+++ILk5GSd9dnBwYExY8Zw/vx5du3ahaurK71790apVBIdHc3169eJj4+nuLgYgJCQEMaNGwc8usXr4+NTpcXdxatJaskKnZo/fz537txh3bp11d2VV4JSqSQgIIDk5GS2bt2KpaUlkydPZuvWrcTExGBjY8O7777Lpk2buHLlSrnaDAoKokmTJoSGhv6hsLo2qVQqfH19sbe35+DBg5w6dQpbW1s8PDxo2rQpDRo0oKSkBIVCQffu3TVl9wDc3d1lVqzQOUmYQqe6detGz549+eijj6q7K3WeQqFg1KhRKJVKoqKiMDU1ZfLkyRw6dIjjx4+jVquZMmUKe/fuJTo6ukJt+/v74+rqyrfffqvzHUfs7e3p0aMHLVq0IDc3l7S0NBQKBYaGhlhbW3P//n3u3bvHrFmzcHJyYsmSJYSEhOi0T0KAJEyhY3p6enz88cesXr2ay5cvV3d36rRBgwbRqFEjwsPDUSqVvPvuu1y8eJH9+/ejUqkICgri5MmTHD58+KXaHzZsGO3bt2fLli2cOHGizGv169dnwIAB3Lp1i19//VUbHweFQoGFhYVmy7GioiISExMpLCzUSvtCVNSzEqbM0hBaUVJSwt27d+nevbskTB3q3bs3TZs2JSwsjNLSUvz8/IiLi2P//v0YGBgwbtw4Ll++/NLJEmDz5s2kp6czdOhQmjVrxnfffQc8GjPduXOnZpJOUFAQGzdurPRnKi0tJS0tjbS0tEq3JYQuScIUWvPzzz/j5+eHnp6eZn9EoT1vvvkmbdq0ITQ0lIKCAkaNGkVBQQFbt25FqVTi7+9PcnIyO3furHSs/fv3Exsbi7+/P//v//0/MjIyMDIyKjOjtVevXlpJmELUFrKsRGjNxYsXKSoqokuXLtXdlTrnzTffpGPHjqxcuZKcnBzeeustzM3NWb9+vWZMs7CwkO+//15rMa9du8ZHH33E+vXruX79OsnJyWVm0B48eFBrsYSoDWQMU2iVv78/tra2/Oc//6nurtQZ3t7etG/fnhUrVpCZmYm3tzdt27blhx9+ICEhAV9fX5RKpaYEni5ZW1szaNAgbt++zYEDB3QaS4jqIoULRJXYs2cPVlZWqFSq6u5KndCzZ088PT0JCwsjMzOTzp074+XlRe/evTlx4gTnz5/HyspKp8nS2NiYnj17EhQUROfOnVm1apUkS/FKkoQptCoxMZGcnBwpkacFvXr1wt3dnbCwMLKysujYsSNdu3YlJiaGzp07A2BhYYGpqanOkqWNjQ0ffvghXbt2BaBDhw4EBwfrrGi7EDWZ/NQLrTt79izu7u7V3Y1a7Y033sDNzY2wsDCys7Px9PSkR48erFixgvj4+DKTqoyMjHTSBzMzM6ZPn05sbCz/+Mc/CA0N5fPPP0etVjN//ny5iyBeOZIwhdbt3bsXlUpFo0aNqrsrtZK1tTXdu3cnIiKCnJwc2rRpQ79+/fjmm2/Q19end+/efP7552zfvp01a9ZgYGBA3759tdoHfX19Zs6cSXp6OmFhYZrnMzMz+fTTTyksLOT999/HyspKq3GFqMlk0o/QidmzZ5OSkkJERER1d6XW8ff3586dOxw6dIjWrVszZMgQwsPDMTQ0xM/Pjx07dnDmzBnN+R4eHowYMYLjx49rrSj53LlzMTQ0ZMGCBRQVFT31nClTpuDu7o6LiwsPHz5k3rx5nDt3TivxhahOMulHVKnU1FQ+/PBDjh49ipeXV3V3p9Zo3Lgx9vb2HD16FHd3d4YMGcKqVauwsLDA39+fDRs2lEmWAGfOnGH16tV07NiR0aNHV7oPU6dOxczMjJCQkGcmS4Bly5bRpUsXPDw86NixI6GhoZWOLURNJglT6ERQUBBWVla4urryxRdfVHd3ao3evXtz4MAB2rVrx8CBA/nmm2+wt7fXJM5n1Xe9fPkyYWFhuLm5ERgY+NLxx44di52dHUuXLi3X/phP3qGysLB46bhC1AaSMIVOKBT/u6Mhk0PKx8HBAVtbW0xNTfH29iYsLIzXXnuNbt26ERoayr179577/tu3b/Pll1/SrFkzpk6dWuH4AwcOpHXr1qxYsYLU1NQXnm9ra8u5c+fIzs4mOzubU6dOSdEKUadJwhQ6MXPmTG7dukViYiKnTp1i3LhxGBsblzlHqVRWU+9qFpVKhY+PDxMmTODBgwe0bt1as8Hy66+/TmhoaLkSGEBCQgIhISHY2toyZ86ccm/q3aVLF7p06cK6deu4c+fOC8+vX78+06ZN49ChQzg4OODg4MDXX3/NwIED6d69e7liClHbyKQfoXPNmzdn1KhRmJqaEhcXx759+5g4cSITJkzg5s2bDBs2TKf7L9ZkSqWS3bt34+npSWlpKVFRUcyZM4du3brRunVrVq5cSXZ2doXbValUzJo1C4BFixY99/aqm5sbY8aMYceOHRw5cqRcbc+bN4+0tDSWLl1a5rUOHTowdOhQDh48yO7duyvcbyFqAtneS1Q7Z2dn+vfvT8uWLRk5cqTm+S1btjBp0qRXsmC7o6Mjp0+f1jzetm0bkZGRtGnThhUrVpCTk/PSbevr6xMcHIy5uTlffvllmTqwjzk4ODB58mSOHDnCjh07ytXm/PnzKSgoYOHChU/9f/Z41u5vv/3Gtm3bXrr/QlQXSZiixrC3tyc6Olpzu/DUqVOcPHmSnJwckpOTuX37NjExMdy9e7eae6p79vb2HDx4UDNhZuXKldy/f19TsEAbJk+ejL29PStXruT27dua562srJg5cyaXLl0iKirqhe3o6ekxd+5c9PX1n7vcBKBly5b4+/tz6dIlzS3eQ4cOVfqzCFEVJGGKGmX48OFMnDiRa9euMW/ePCwsLHBzc8PJyQkbGxvNRKG8vDxNEr148SKxsbFPbc/AwIDi4uJadZXapEkT3nnnHY4ePUrr1q0xMTGhtLRUUzdWm0aPHk2bNm347rvvSEtLo7i4mHfffZekpCS+/vrrcrURHBxMvXr1WLBgAfn5+S88v0mTJkRERODh4QE8WobywQcfVOZjCFElJGGKWsfOzq5MEjU1NUWhUJCbm0tKSgp37tzh4sWLvPnmm3z++efk5+czfvz4WlEYvGnTpowdO5aNGzdy5coVOnToQI8ePQgNDSU9PV0nMfv378/8+fNp06aNZiuwKVOmlOu9QUFBNG7cmP/85z8VSuaXLl3C1tYWeDQhqXXr1i/VdyGq0rMSpmwgLWqs+Ph44uPjyzzXqFEjWrduTdOmTWnXrh1vvPEGEyZMwMDAAAMDAxYtWoS/vz9Xr17l4cOHZd6rVCrp3bs3WVlZ5ZrcoivNmzdn9OjRrFu3jhs3buDu7k6vXr0ICwvTWbIEOHz4sObWq4GBQblLF/r5+dGkSROWLFlS4Svf48ePM2jQIABOnjxZsQ4LUcNIwhS1SkJCAgkJCWWe8/Hxwc7ODni0kH7UqFEolUqKiorIysoiOTmZ2NhYJk+eTM+ePQFYsmQJCxcu1No4YXk1a9aM0aNHExUVxa1bt2jRogWDBg1i5cqV5V468rJyc3PJzMxErVYDj5LmiwwdOpRWrVqxfPnyp04aepGgoCB+++03AFatWlXh9wtRk8gtWVHrtW3blr///e/k5uYyf/587t69i7GxMS4uLjRr1ozGjRtjYWHBjBkzNNtS3b9/n3Xr1qFQKEhOTiYpKYmkpCQSEhK4d+8eeXl5Wu+ng4MD77zzDmvXruXmzZvY2dkRGBioSZ66NmjQIAYOHIhKpSItLY38/HwSExP54osvnjqBp0+fPnh7exMREcGVK1d03j8hagoZwxSvvB07dvCnP/0JeLQF2dq1a7l//z4ZGRkUFhZiY2NDw4YNsbOzIyUlhbNnz3Lq1KlylYh7EVtbWyZOnMiGDRu4du0aFhYWTJ48mW3bthETE1Pp9l/Ey8uLwYMHs3btWi5cuACAWq1mxowZlJaWsnjx4jJX2507d+att95i06ZNREdH67x/QtQkkjDFK8/c3Bw/Pz+ysrLYsmULdnZ2ODo60rx5cxo1asT169c5deoU165dw8HBgfbt2+Pq6srRo0c5fPjwH8ZEy6t+/fpMnjyZnTt3cvbsWUxNTTVrHx/frtQlZ2dnAgIC2LNnDz///HOZ1/T19ZkxYwb16tUjKiqKxo0bo1Ao6NmzJzt37uTw4cM6758QNY0kTCGew8TEBDc3N15//XXMzc05fPgwJ06cQK1W07dvX+zs7Fi/fv0L67n+3uPk+Ouvv3L06FEMDAx49913uXbtGnv27NHRp/kfGxsbgoODOX36NJs2bXrmedOnT2f27Nmo1WoKCgr429/+xsqVK3XePyFqIpklK8Rz5OXlceLECU6cOEGTJk3o3r07b775Jj/++CPr1q2jTZs2BAQEcODAgXLPsDU0NGT8+PGcP3+eo0ePoqenx9ixY0lMTKySZGlsbMy0adOIi4t7brIEuHXrlmYykJGRkeZYCPE/UnxdiN+Ji4tj9erVbNiwgZ49e+Lv78+tW7f46quv6NixI/379y+zG8vTKJVK/P39iY+P1yRHX19fAL7//nudfwY9PT1mzpxJTk4Oy5cvf+H5iYmJZSb+nD17VpfdE6JWkluyQjyHUqmkV69etG/fnsjISFJSUhg3bhxpaWls2rTpqZWFFAqFZmnL2rVrKSkpoU+fPrRo0YIVK1ZQWFio835PmzYNKysrPvnkkxeOvarVaubMmYNSqSQ/P5/jx49L4XTxSpMxTCEqwcXFheHDh7Np0yZu3LjBmDFj0NPTIyoq6g8JycfHh4YNGxIeHk5RURGdOnWiS5cuLF++vFLF1MtrzJgxtGrVioULF/LgwYPnnmtsbMz7779Peno6S5Ys0XnfhKgNnpUw5ZasEOVw5coVIiIiGDZsGG3btiUyMpLMzEwCAwPL7DnZp08fnJyciIiIoKioCDc3N7p37054eHiVJMs+ffrg5ubGypUrX5gs9fX1mT17Nnl5eXzxxRc675sQtZ0kTCHKKS4ujtDQULp37463tzebN28mMzOTQYMGYWRkRI8ePWjVqhXffPMNBQUFNG3alCFDhhAREfHC5KUN7dq1w9vbm02bNpXZleRp9PT0mD17NvBov8zaVLReiOoit2SFqCBzc3PGjRtHdnY2tra2zJ07l8LCQrZs2cK8efM0z0+cOJHvvvuO69ev67xPjo6OBAUFlXvj5oruPCLEq0TGMIXQIqVSSefOndm4cSOGhoYAxMTE0LVrVywtLQkKCuLHH3/U+WxTR0dHFAoFEydOLPe+lpMnT8bOzq7CO48I8aqQMUwhtKi4uJjDhw+XKQTv4ODAyZMn+fLLLzlw4IDOk+XixYs5ffo0x44dQ6VSlStZjhs3Dnt7+5faeUSIV50kTCEqYezYsezevZvY2FjMzc1p1qwZffr04e7duzqNa21tzTvvvAOUf6uuoUOH8tprr7Fs2TKd74wiRF0kCVOISrh48SKjR49m//79muf09PTKtXVWZWRlZZWZdfvkTN2n6dy5Mx06dGD16tUVLu8nhHhEEqYQlaRUKomNjeX27dtkZWVx7NgxhgwZotlKTBeGDBnCjz/+yPbt24mIiODmzZsEBAQ89dzmzZvz1ltvsWvXLtmmS4hKkEk/QlTS8OHDMTExYc2aNZSUlKBWq5k5cyYFBQUsWrTopXc5eZbevXvTvXt3Vq5cyc2bNwGws7NjypQp3L9/n6+++kpzroWFBbNnz+bcuXNs2LBBq/0Qoq6SWbJC6EDfvn1p3rz5H0reGRsbM3PmTAwMDFi0aFGZvSYro2PHjgwZMuSp+1RaWFgQHBxMVlYWR44cwdLSkg4dOpCSksKXX36plfhCvAokYQqhZX/605/o3Lkzy5Yte+om03p6epr1jl9++SXJycmViteyZUv8/f2fuq/lYyqVijVr1uDt7Q3AjRs38PLyksIEQlSALCsRQovc3Nzw9vYmPDz8qckSoKSkhEWLFpGQkMCMGTNo0qTJS8ezt7fH39+fY8eOPTNZAuTm5qJSqTSPmzdvrlknKoSoHEmYQlSQk5NThUreLV++nMuXLzNlyhRcXV0rHM/CwoLJkydz6dIltm7d+sLzjx07pjlOTk6mQYMGFY4phPgjuSUrRAU0aNCASZMmvVTJu8GDB+Pl5cX333/PyZMny/UelUrFvHnzSE5OLjOZ53kUCgVjx47FwsKCgoICnJyc2LBhA2fOnKlQf4V4VT3rluzzF28JITTUajUBAQH88MMPL1UfduvWrWRnZ+Pr64uZmdlzb63Co7WVjzeBXrZsWbnjlJaWsmbNGs3jfv36MXLkSKytrdm3b1+F+y2EeEQSphDlYGxsTGBgIEePHq1Uybv9+/eTnZ3N4MGDUavVbNu27ZnnBgcHo1AoCAkJqdSknV27dpGSkoKvry/W1tasX7/+pdsS4lUmY5hCvIC+vj7vvPMO169f5/Dhw5Vu79ixY6xZs4ZOnToxZsyYp54zZcoUzM3NWbRoEUVFRZWOefLkSVauXImbmxvvvfeeTosqCFFXyRimEM+hUCgYPXo0paWlrF+/nuf9e6koR0dHJk2aRGxsLGFhYZrn/fz8cHV1JSQkROs1X62srJg+fToGBgaYm5uTl5fHggULSEtL02ocIWozWYcpxEsYNGgQDRs2JDw8nOLiYq23b2Njw/Tp07G1tcXa2pqCggJiY2P5+uuviY2N1Xo8eHR7OTo6moYNGwKwZ88eRo0apZNYQtRGMulHiAp68803adasGcuXL9dJsoRHyz7Wr1/PwYMHUSqVwKNlKLpKlgD5+fmYmJhoHjdt2lRnsYSoS2QgQ4in8PDw4E9/+hOrVq2ioKBAp7EMDQ01yRIe3QbWtaVLlwKP9vWUsnlClI9cYQrxO87OzgwcOJCwsLAq2WRZX1+f69ev06JFC+7evVtmPFNXQkJC2LhxI8XFxWU2wRZCPJuMYQrxhMaNGxMQEMDq1at1elv0sebNmzNhwgT279/PqVOnyMrK0tntXyFE+cgYphAvYGVlxbhx49i8eXOVJEsbGxsCAwM5ffp0mQ2ohRA1k4xhCgGYmZkRGBjI3r17uXTpks7jqVQqpk2bRmxsLBs3btR5PCFE5UnCFK88Q0NDAgICiI6O5sSJEzqP97jkXXZ2NqGhoTqPJ4TQDkmY4pWmVCrx9/cnLi6uym6LTps2DaVSyZIlS6oknhBCOyRhileWQqFg+PDhPHz4sFzbZmlDQEAAVlZWLF68mIcPH1ZJTCGEdkjCFK+sAQMGUK9ePdatW6fVknfP4uPjQ4sWLVi2bFmVLFcRQmiXJEzxSuratSvOzs6sXr1aK8XNX6RLly506tSJqKgo4uPjdR5PCKF9kjDFK8fDw4MuXbqwatUq8vLydB6vVatWDBw4kB07dnDx4kWdxxNC6IYkTPFKeVzFJzw8nIyMDJ3Hs7Ozw8/Pj99++40jR47oPJ4QQnekcIGo85o3b87cuXMBSElJYcWKFSQlJeksnr6+PlOnTsXJyQkDAwOio6Ofu1G0EKJ2kNJ4os47efIkzZo1A+DAgQMMGzZMp/H+9re/MXPmTACysrJwdnaWGbFC1CLPKo0nt2RFnWdvb685btCggc7jtWzZUnNsbm6OhYWFzmMKIXRPEqao01QqFb/++isARUVF3L17F2dnZ53GzMjI0My8vXnzJp6enjqNJ4SoGnJLVtRZRkZGTJw4kRs3bnD27Fny8/Pp0aMH7du3Z8uWLTopg/fee+/RoEEDoqKiUKlUAIwYMYKYmBiioqK0Hk8IoX3PuiUrCVPUSfr6+gQEBJCcnMx///vfMq/16NGDXr16cfDgQXbv3q21mBMmTMDJyYlFixbx4MEDzfOOjo5MmjSJhIQEli1bRklJidZiCiG0T8YwxStDT0+PMWPGkJWV9dSSdz/99BObNm2iW7dujBw5UisxR4wYQbNmzfj666/LJEuAO3fuEBISgo2NDXPmzMHQ0FArMYUQVUsSpqhTHteH1dPTY8OGDc8seRcdHc3KlStxd3cnKCioUjH79u2Lh4cH4eHhJCQkPPWc1NRUPv30U5RKJfPnz0etVlcqphCi6knCFHWKj48P9erVIyoq6oW3Pm/evMnixYuxs7Njzpw56OtXfFly586d6datGxs2bODGjRvPPTc/P58FCxaQmZnJ3LlzadSoUYXjCSGqjyRMUWf06dOHJk2aEBERQWFhYbnek5yczIIFCzA2Nmb+/PmYmZmVO16rVq1466232L17N2fOnCnXe0pKSli8eDG3bt1i2rRpuLi4lDueEKJ6ScIUdULXrl1xc3Nj1apVFBQUVOi9ubm5fPrpp+Tl5TFv3jxsbGxe+B4HBwf8/Pz49ddfOXjwYIX7Gx4ezqlTpxg3bhwdOnSo8PuFEFVPZsmKWsvR0ZGmTZtSVFREly5dWL58eaXrw7777rs4OjoSHh7+zFusVlZWzJw5k8uXL7NmzZpKxevevTu9e/fm559/Zs+ePZVqSwihHbKsRNQpnTt3ZtOmTRgbG5OYmEjPnj21tm3W8OHDadeuHZs2bSI6OrrMayqVivfff5/79++zbNkyrcTz9PTk7bff5syZM2zYsEErbQohXt6zEqYUXxe10tChQzE2NgbA1taWhg0bai1hbty4kQcPHvD2229jYWHB/v37gUdrO2fNmkVWVpbWkiU8mrGbkZFBYGAg9evXJywsDGNjY/Lz87UWQwhReZIwRa104cIFzfGDBw+4ffu2Vtvft28f6enp+Pr64uvrqxnXPHv2LIsXL9ZqLIAbN26wePFi5s6dy6VLl7C1tWXHjh2MHz+e4uJirccTQlScJExRK+Xk5BAWFkZ2djabN28mLS1N6zFOnjzJa6+9xpdffql5bs2aNZo6sdqWnJxMWloatra2AAwcOBBvb2/NFa4QonpJwhS1jpubG46Ojnz00Uc63zbr91d3VlZWOo13//79Mo9/XzVICFF9JGGKWkWtVjN48GAiIiKqZI/JwsJCkpKSaNCgAcnJyTg6Oup0fHH16tU0b94cT09Pvv/++z9MOhJCVB+ZJStqDYVCQWBgILdu3eKnn37SebxOnTrh4+PD+vXrSUhIIDMzk5kzZ2JkZERISAiZmZk674MQoupJ8XVR63Xp0gUDAwN+/vlnncdydXXFx8eH3bt3c+7cOZKTkykoKOCzzz4jIyODOXPmaMYahRCvBkmYolZo2LAh3t7ebNiwQefbYzVq1Ah/f3+OHz/+hyo+j0vbxcXF8ec//5mmTZvqtC9CiJpDEqao8VQqFWPGjOHHH3/UyWzYJ6nVaqZOncqNGzf+sI/mk1asWMH58+eZNGkSnp6eOu2TEKJmkEk/okYzMDBg/PjxXLx4UecTYAwNDQkODiY1NZXw8PAXnr9+/XpSU1MZPnw4arW6Sm4VCyGqjyRMUWPp6ekxduxYkpOT2bVrl87jzZgxg6KiIpYuXVru9+zdu5fMzEwGDx6MmZkZP/zwgw57KISoTpIwRY01bNgwSktL2bx5s85jTZkyBTMzMxYsWFDhMdJjx46Rk5PDmDFjMDMzY/369TrqpRCiOskYpqiR+vXrh7W1NWvXrtX5JJ9Ro0bRuHFjli5dSm5u7ku1ceHCBVasWEGbNm2YOHGilnsohKgJJGGKGueNN96gVatWFdoI+mX17dsXd3d3vvnmG1JTUyvV1q1bt1i6dCmOjo78+c9/Rk9P/nkJUZdI4QJRo3h4eNCvXz+WLVtW6b0tX6RDhw74+vqyYcMGTp8+rbV269evT3BwMLm5ufz6669YWFiwa9euKqlMJISoPNkPU9R4zs7OjBgxghUrVpCUlKSTGCYmJnTv3h2FQkGXLl3Yt2+fTqoGqVQqIiMj6d69OwA///wzvr6+Wo8jhNA+2Q9T1Gj29vaMHDmSyMhInSVLpVLJtm3baN++PSUlJaxYsUJnJfZyc3MxNDTUPPb29sbMzIzs7GydxBNC6J4MsohqZ21tzTvvvMPmzZu5c+eOzuI4ODjQvn174NGSlQYNGugsFsDRo0c1x2fPnpVkKUQtJ1eYolqZm5sTEBDA3r17uXTpkk5jJScnk5GRQb169YBHt0319fV1tr/lJ598wtWrV7GxsWHt2rU6iSGEqDoyhimqjZGREZMnT+bcuXMcOHBA5/GCg4Np1KgRiYmJJCQk0KxZM/T09FiyZInsPCKE0JBJP6JG0dfXJzAwkPv377Nt2zadxxs3bhwtWrTg888/1yRHfX19pk2bhpWVFaGhody9e1fn/RBC1HyyvZeoMRQKBSNHjiQ7O5vt27frPN7AgQNxcXFh+fLlZa4ki4qKWLx4MVevXmXq1Km0bdtW530RQtRekjBFlRs8eDAmJiZ89913PO8OhzZ4eXnRpUsX1q1bx7179556TmRkJIcPH2bUqFH07NlTp/0RQtReMulHVClvb28cHBwIDQ2luLhYp7GcnZ0ZPHgwe/bs4fz58889d+fOnSQnJ+Pr64tarWbLli067ZsQovaRhCmqjLu7O506deKrr76ioKBAp7FsbGwYP3480dHR5d526+TJk2RlZTFu3DhUKhVRUVE67aMQonaRW7KiSjg6OuLj48O3335LVlaWTmOpVCqmTZtGXFwcmzZtqtB7r1y5wvLly2nZsiWTJk3SUQ+FELWRJEyhc9bW1vj5+bFhwwbu37+v01h6enrMmDGDnJwcli9f/lJtxMbG8sUXX+Dg4CBF1IUQGvKbQOjU48IEu3fv5urVqzqP995772FoaMjixYsr1U5iYiILFy7E0tKS2bNno68voxdCvOokYQqdMTIyIiAggJMnT3Ly5Emdxxs7diy2trYsXbpUKzuDpKen89lnn2FkZMT777+PsbGxFnophKitpHCB0CqFQsGkSZNwcXEhOzub6Ohotm7dqvO4ffv2pVu3boSGhmq9Hq2hoSEzZ87E2NiYhQsXoq+vT0ZGhs6XxAghqodU+hFVYvLkyfz73/8GID8/H3d3d1JSUnQSy97enn/84x9YWVkRHx/PypUrtbqv5ZP09PQIDg7Gz88PJycnrl+/jo+Pj87HZIUQVU8q/Ygq4eLiojk2NjamYcOGOosVFhaGr68v3bp1o2PHjjpLlgAlJSVER0fj5OQEQIsWLRg3bpzO4gkhah5JmEKr1q5dq9nG6t69e1haWuoslr29vebYwsJCZ3EeS05OpqSkRPM4MTFR5zGFEDWHTP0TWnXixAnat2+PnZ0d9erVo1+/fiiVSq3vRmJlZcXly5dp1KgRAOfOnWPw4ME6HS+NiYlh+vTpvP3225w+fZqIiAidxRJC1Dwyhil0qkOHDgwdOpRjx45pLZmp1WrmzJlDQkICa9asAaBJkyaMHTuWO3fuEBYWppU4QohXk0z6EdXG1dWVd955h0uXLhEZGVmptlQqFXPnziUjI+MPay1tbW2ZOnUqubm5LFmyhPz8/Oe21bFjR6ysrNi3bx+FhYWV6pcQou6QST+i2ly+fJmvv/4aFxcXpk6d+tLtGBoaMmvWLHJzc1m6dOkfXk9MTOSTTz5BoVAwf/58bGxsntnWxIkT2bVrF1FRUaxbt+6l+ySEeHVIwhRV4u7du4SEhGBra8ucOXMqXDnn8bKO0tJSQkJCyky+eVJ+fj6fffYZ9+/fJzg4mFatWj31PB8fH81xjx49MDMzq1B/hBCvHkmYosqkpqayYMECjI2Nef/991GpVOV+7+TJk1GpVCxcuJCioqLnnltSUsLy5cs5fvw4fn5+T93jMj09XXN84cIFzcxeIYR4FhnDFFVOX1+f4OBgzM3NWbp0Kampqc89f+zYsbRs2ZKQkJAXnvt7jycdXbp0ic2bN9OwYUOaN29O9+7dSU5OprCwkDVr1pRJoEKIV5tM+hE1ztSpU7GzsyM0NJS4uLinnjNgwADeeOONSpW8a9KkCXPnzmXIkCGYmZkRHx/PxIkT+e233yrTfSFEHSWTfkSN8/XXX3PlyhWmTJny1LHGzp0788Ybb7Bu3bpK1YeNi4sjIyNDM05pZ2eHgYHBS7cnhHg1ScIU1SoyMpJjx47h5+eHl5eX5nlXV1feeustdu3axfnz5ysd5/r165rj4uJiDA0NK92mEOLVIrdkRY3g7e3NW2+9RcuWLalfvz7x8fGsWbNGq5V7pk+fTtu2bbl79y6Ghobs2bOH2NhYDAwMuHLlitbiCCFqNxnDFDVeaGgow4cPBx5dBbZt25b4+HidxOrcuTN/+ctf6NKlCwCff/45n3zyiU5iCSFqFxnDFDVeTk6O5lipVOp0w+ajR4/i4OCgeTxp0iSdxRJC1A2SMEWNERISwuXLl3n48CGLFy/m5s2bOo134cIFzfHVq1d1GksIUfvJLVnxylKr1cycORMDAwOWLFlCcnJydXdJCFEDyBimEEIIUQ4yhimEEEJUgiRMIYQQohwkYQohhBDlIAlTCCGEKIfnTvoRQgghxCNyhSmEEEKUgyRMIYQQohwkYQohhBDlIAlTCCGEKAdJmEIIIUQ5SMIUQgghyuH/AzncFox73w51AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 576x576 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ox.config(log_console=False, use_cache=False)\n",
    "# Get the ROADS and NODES of Back bay, Boston\n",
    "# NODES(white dots) and EDGES(grey lines) are stored in Digraph\n",
    "place_name = \"Back Bay, Massachusetts, USA\"\n",
    "mode = 'drive'\n",
    "optimizer = 'length'\n",
    "graph = ox.graph_from_place(place_name,network_type=mode)\n",
    "fig, ax = ox.plot_graph(graph)\n",
    "plt.tight_layout()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Extract NODES and EDGES\n",
    "nodes, edges = ox.graph_to_gdfs(graph, nodes=True, edges=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>y</th>\n",
       "      <th>x</th>\n",
       "      <th>street_count</th>\n",
       "      <th>highway</th>\n",
       "      <th>ref</th>\n",
       "      <th>geometry</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>osmid</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>61340721</th>\n",
       "      <td>42.351513</td>\n",
       "      <td>-71.086995</td>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>POINT (-71.08700 42.35151)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61340738</th>\n",
       "      <td>42.350897</td>\n",
       "      <td>-71.077742</td>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>POINT (-71.07774 42.35090)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61340743</th>\n",
       "      <td>42.351478</td>\n",
       "      <td>-71.075600</td>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>POINT (-71.07560 42.35148)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61340777</th>\n",
       "      <td>42.350843</td>\n",
       "      <td>-71.089478</td>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>POINT (-71.08948 42.35084)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61340918</th>\n",
       "      <td>42.351919</td>\n",
       "      <td>-71.085492</td>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>POINT (-71.08549 42.35192)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7597279640</th>\n",
       "      <td>42.346796</td>\n",
       "      <td>-71.085049</td>\n",
       "      <td>3</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>POINT (-71.08505 42.34680)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7703847341</th>\n",
       "      <td>42.346233</td>\n",
       "      <td>-71.078573</td>\n",
       "      <td>3</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>POINT (-71.07857 42.34623)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7775135474</th>\n",
       "      <td>42.348102</td>\n",
       "      <td>-71.088705</td>\n",
       "      <td>3</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>POINT (-71.08871 42.34810)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8280086763</th>\n",
       "      <td>42.347934</td>\n",
       "      <td>-71.078730</td>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>POINT (-71.07873 42.34793)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8280086764</th>\n",
       "      <td>42.347609</td>\n",
       "      <td>-71.079021</td>\n",
       "      <td>3</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>POINT (-71.07902 42.34761)</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>148 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                    y          x  street_count highway  ref  \\\n",
       "osmid                                                         \n",
       "61340721    42.351513 -71.086995             4     NaN  NaN   \n",
       "61340738    42.350897 -71.077742             4     NaN  NaN   \n",
       "61340743    42.351478 -71.075600             4     NaN  NaN   \n",
       "61340777    42.350843 -71.089478             4     NaN  NaN   \n",
       "61340918    42.351919 -71.085492             4     NaN  NaN   \n",
       "...               ...        ...           ...     ...  ...   \n",
       "7597279640  42.346796 -71.085049             3     NaN  NaN   \n",
       "7703847341  42.346233 -71.078573             3     NaN  NaN   \n",
       "7775135474  42.348102 -71.088705             3     NaN  NaN   \n",
       "8280086763  42.347934 -71.078730             4     NaN  NaN   \n",
       "8280086764  42.347609 -71.079021             3     NaN  NaN   \n",
       "\n",
       "                              geometry  \n",
       "osmid                                   \n",
       "61340721    POINT (-71.08700 42.35151)  \n",
       "61340738    POINT (-71.07774 42.35090)  \n",
       "61340743    POINT (-71.07560 42.35148)  \n",
       "61340777    POINT (-71.08948 42.35084)  \n",
       "61340918    POINT (-71.08549 42.35192)  \n",
       "...                                ...  \n",
       "7597279640  POINT (-71.08505 42.34680)  \n",
       "7703847341  POINT (-71.07857 42.34623)  \n",
       "7775135474  POINT (-71.08871 42.34810)  \n",
       "8280086763  POINT (-71.07873 42.34793)  \n",
       "8280086764  POINT (-71.07902 42.34761)  \n",
       "\n",
       "[148 rows x 6 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nodes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Feed nodes and lengths to algorithms, algo returns bunch of nodes, iterate through the nodes 2 by 2\n",
    "NodesAndLength = list(graph.edges(data='length'))\n",
    "\n",
    "EdgeAndLength = {}\n",
    "\n",
    "for i in NodesAndLength:\n",
    "    EdgeAndLength[(i[0],i[1])] = i[2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Thank you for using our Navigator (Back Bay, Boston, USA)!\n",
      "Please enter your starting location and destination location (in Back Bay, Boston)\n",
      "You can either enter a place's name or the place's coordinate in this format: latitude, longitude \n",
      "*Note that only places that could be found on OpenStreetMap can be used*\n",
      "Recommendations: first church in boston --> Atlantic fish back bay\n",
      "                 boston architectural college --> gibson house back bay\n",
      "42.353670300000005 -71.07475378063705\n",
      "42.3492931 -71.0811812\n",
      "61341786\n",
      "349355356\n"
     ]
    }
   ],
   "source": [
    "# === Takes USER INPUTS and Find the nearest nodes on current map ===\n",
    "print(\"Thank you for using our Navigator (Back Bay, Boston, USA)!\\n\\\n",
    "Please enter your starting location and destination location (in Back Bay, Boston)\\n\\\n",
    "You can either enter a place's name or the place's coordinate in this format: latitude, longitude \\n\\\n",
    "*Note that only places that could be found on OpenStreetMap can be used*\\n\\\n",
    "Recommendations: first church in boston --> Atlantic fish back bay\\n\\\n",
    "                 boston architectural college --> gibson house back bay\")\n",
    "# startPoint = sys.argv[1]\n",
    "# destPoint = sys.argv[2]\n",
    "# startPoint = input(\"Your starting location: \")\n",
    "# destPoint = input(\"Your destination: \")\n",
    "startPoint = \"first church in boston\"\n",
    "destPoint = \"Atlantic fish back bay\"\n",
    "# ===================================================================\n",
    "\n",
    "if startPoint[0].isdigit():\n",
    "    # Enter by HAND\n",
    "    (start_lat,start_long) = tuple(float(x) for x in startPoint.split(\",\")) # (latitude, longitude)\n",
    "    (end_lat,end_long) = tuple(float(x) for x in destPoint.split(\",\")) # (latitude, longitude)\n",
    "\n",
    "    orig_node = ox.distance.nearest_nodes(graph, start_long, start_lat)\n",
    "    dest_node = ox.distance.nearest_nodes(graph, end_long, end_lat)\n",
    "\n",
    "else:\n",
    "    # Enter by GEOCODE\n",
    "    try:\n",
    "        locator = Nominatim(user_agent = \"myapp\")\n",
    "        startPoint = locator.geocode(startPoint)\n",
    "        print(startPoint.latitude, startPoint.longitude)\n",
    "    except:\n",
    "        raise ValueError(\"Cannot find the place entered for departure.. \\nPlease enter a place that exists in OpenStreetMap\\n\")\n",
    "    try:\n",
    "        destPoint = locator.geocode(destPoint)\n",
    "        print(destPoint.latitude, destPoint.longitude)\n",
    "    except:\n",
    "        raise ValueError(\"Cannot find the place entered for destination.. \\nPlease enter a place that exists in OpenStreetMap\\n\")\n",
    "        \n",
    "    (start_long, start_lat) = (startPoint.longitude, startPoint.latitude)\n",
    "    (end_long, end_lat) = (destPoint.longitude, destPoint.latitude)\n",
    "\n",
    "    orig_node = ox.distance.nearest_nodes(graph, startPoint.longitude, startPoint.latitude)\n",
    "    dest_node = ox.distance.nearest_nodes(graph, destPoint.longitude, destPoint.latitude)\n",
    "\n",
    "print(orig_node)\n",
    "print(dest_node)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Starting computing shortest paths: Dijkstra, Bellman-Ford, and A* algorithm."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Graph:\n",
    "    def __init__(self, num_of_vertices, node_list):\n",
    "        self.v = num_of_vertices\n",
    "        self.visited = []\n",
    "        self.graph = []\n",
    "        self.node_list = node_list # list of all the nodes\n",
    "        \n",
    "    def add_edge(self, u, v, weight):\n",
    "        self.graph.append([u, v, weight])\n",
    "    \n",
    "    def h(self, lat1, lon1, lat2, lon2):\n",
    "        '''\n",
    "        TO DO:\n",
    "        This is to calculate the heuristic distance\n",
    "        '''\n",
    "        distance = geodesic((lat1,lon1), (lat2,lon2)).m\n",
    "        return distance\n",
    "    \n",
    "    def get_neighbors(self, n):\n",
    "        '''\n",
    "        TO DO: To get the neighbors and weights of node n\n",
    "        '''\n",
    "        neighbors_list = []\n",
    "        reshape_graph = np.array(self.graph).reshape(-1, 3)\n",
    "        # if n is at the first column\n",
    "        for array in reshape_graph:\n",
    "            if n in array[:-2]:\n",
    "                array = np.delete(array, np.where(array == n))\n",
    "                neighbors_list.append(array)\n",
    "        \n",
    "        return neighbors_list\n",
    "    \n",
    "    def dijkstra(self, start_vertex):\n",
    "        D = {v:float('inf') for v in self.node_list}\n",
    "        D[start_vertex] = 0\n",
    "        \n",
    "        pre_nodes = {}\n",
    "    \n",
    "        pq = queue.PriorityQueue()\n",
    "        pq.put((0, start_vertex))\n",
    "    \n",
    "        while not pq.empty():\n",
    "            (dist, current_vertex) = pq.get()\n",
    "            self.visited.append(current_vertex)\n",
    "    \n",
    "            for node in self.node_list:\n",
    "                for edge in self.graph:\n",
    "                    if current_vertex == edge[0] and node == edge[1]:\n",
    "                        distance = edge[2]\n",
    "                        if node not in self.visited:\n",
    "                            old_cost = D[node]\n",
    "                            new_cost = D[current_vertex] + distance\n",
    "                            if new_cost < old_cost:\n",
    "                                pq.put((new_cost, node))\n",
    "                                D[node] = new_cost\n",
    "\n",
    "                                pre_nodes[node] = current_vertex\n",
    "        return D, pre_nodes\n",
    "    \n",
    "    def bellman_ford(self, src):\n",
    "        q = queue.Queue()\n",
    "        \n",
    "        inqueue = {v:False for v in self.node_list}\n",
    "        inqueue[src] = True\n",
    "        \n",
    "        distance = {v:float('inf') for v in self.node_list}\n",
    "        distance[src] = 0\n",
    "        \n",
    "        q.put(src)\n",
    "        \n",
    "        pre_nodes = {}\n",
    "        \n",
    "        while(q.empty() != True):\n",
    "            node = q.get()\n",
    "            for edge in self.graph:\n",
    "                if node == edge[0]:\n",
    "                    end_node = edge[1]\n",
    "                    weight = edge[2]\n",
    "                    if distance[end_node] > distance[node] + weight:\n",
    "                        distance[end_node] = distance[node] + weight\n",
    "                        pre_nodes[end_node] = node\n",
    "                        \n",
    "                        if inqueue[end_node] == False:\n",
    "                            q.put(end_node)\n",
    "                            inqueue[end_node] == True\n",
    "                            \n",
    "        return distance, pre_nodes\n",
    "    \n",
    "    def a_star_algorithm(self, start, stop, graph):\n",
    "        # In this open_lst is a list of nodes which have been visited, but who's \n",
    "        # neighbours haven't all been always inspected, It starts off with the start node\n",
    "        # And closed_lst is a list of nodes which have been visited\n",
    "        # and who's neighbors have been always inspected\n",
    "        open_lst = set([start])\n",
    "        closed_lst = set([])\n",
    "        \n",
    "        lat1 = graph.nodes[start]['y']\n",
    "        lon1 = graph.nodes[start]['x']\n",
    " \n",
    "        # poo has present distances from start to all other nodes\n",
    "        # the default value is +infinity\n",
    "        poo = {}\n",
    "        poo[start] = 0\n",
    " \n",
    "        # par contains an adjac mapping of all nodes\n",
    "        par = {}\n",
    "        par[start] = start\n",
    " \n",
    "        while len(open_lst) > 0:\n",
    "            n = None\n",
    " \n",
    "            # it will find a node with the lowest value of f() -\n",
    "            for v in open_lst:\n",
    "                lat2 = graph.nodes[v]['y']\n",
    "                lon2 = graph.nodes[v]['x']\n",
    "                if n == None or poo[v] + self.h(lat1, lon1, lat2, lon2) < poo[n] + self.h(lat1, lon1, lat2n, lon2n):\n",
    "                    n = v\n",
    "                    lat2n = graph.nodes[v]['y']\n",
    "                    lon2n = graph.nodes[v]['x']\n",
    " \n",
    "            if n == None:\n",
    "                print('Path does not exist!')\n",
    "                return None\n",
    " \n",
    "            # if the current node is the stop\n",
    "            # then we start again from start\n",
    "            if n == stop:\n",
    "                reconst_path = []\n",
    " \n",
    "                while par[n] != n:\n",
    "                    reconst_path.append(n)\n",
    "                    n = par[n]\n",
    " \n",
    "                reconst_path.append(start)\n",
    " \n",
    "                print('Path found: {}'.format(reconst_path))\n",
    "                return reconst_path\n",
    " \n",
    "            # for all the neighbors of the current node do\n",
    "            neighbor_list = self.get_neighbors(n)\n",
    "            for array in neighbor_list:\n",
    "                m, weight = array[0], array[1]\n",
    "              # if the current node is not presentin both open_lst and closed_lst\n",
    "                # add it to open_lst and note n as it's par\n",
    "                if m not in open_lst and m not in closed_lst:\n",
    "                    open_lst.add(m)\n",
    "                    par[m] = n\n",
    "                    poo[m] = poo[n] + weight\n",
    " \n",
    "                # otherwise, check if it's quicker to first visit n, then m\n",
    "                # and if it is, update par data and poo data\n",
    "                # and if the node was in the closed_lst, move it to open_lst\n",
    "                else:\n",
    "                    if poo[m] > poo[n] + weight:\n",
    "                        poo[m] = poo[n] + weight\n",
    "                        par[m] = n\n",
    " \n",
    "                        if m in closed_lst:\n",
    "                            closed_lst.remove(m)\n",
    "                            open_lst.add(m)\n",
    " \n",
    "            # remove n from the open_lst, and add it to closed_lst\n",
    "            # because all of his neighbors were inspected\n",
    "            open_lst.remove(n)\n",
    "            closed_lst.add(n)\n",
    " \n",
    "        print('Path does not exist!')\n",
    "        return None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def print_result(previous_nodes, shortest_path, start_node, target_node):\n",
    "    path = []\n",
    "    node = target_node\n",
    "    \n",
    "    while node != start_node:\n",
    "        path.append(node)\n",
    "        node = previous_nodes[node]\n",
    " \n",
    "    # Add the start node manually\n",
    "    path.append(int(start_node))\n",
    "\n",
    "    print(\"We found the following best path with a value of {}.\".format(shortest_path[target_node]))\n",
    "    print(path)\n",
    "    \n",
    "    return path, \"{:.2f}\".format(shortest_path[target_node])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "We found the following best path with a value of 1548.6380000000001.\n",
      "[349355356, 3051041198, 3051043395, 8280086764, 61371318, 1038897344, 61371341, 61342109, 61372777, 61374245, 6462995309, 61340743, 61341751, 61343986, 61341770, 61353248, 7541401287, 61341786]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'1548.64'"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Dijkstra Algorithm\n",
    "\n",
    "g = Graph(nodes.shape[0], list(nodes.index))\n",
    "for t in NodesAndLength:\n",
    "    g.add_edge(t[0], t[1], t[2])\n",
    "    \n",
    "D, pre_nodes1 = g.dijkstra(orig_node)\n",
    "dij_path, dij_length = print_result(pre_nodes1, D, start_node=orig_node, target_node=dest_node)\n",
    "\n",
    "dij_path.reverse()\n",
    "dij_length"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "We found the following best path with a value of 1548.6380000000001.\n",
      "[349355356, 3051041198, 3051043395, 8280086764, 61371318, 1038897344, 61371341, 61342109, 61372777, 61374245, 6462995309, 61340743, 61341751, 61343986, 61341770, 61353248, 7541401287, 61341786]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'1548.64'"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Bellman-Ford Algorithm\n",
    "g = Graph(nodes.shape[0], list(nodes.index))\n",
    "for t in NodesAndLength:\n",
    "    g.add_edge(t[0], t[1], t[2])\n",
    "\n",
    "D, pre_nodes2 = g.bellman_ford(orig_node)\n",
    "bell_path, bell_length = print_result(pre_nodes2, D, start_node=orig_node, target_node=dest_node)\n",
    "\n",
    "bell_path.reverse()\n",
    "bell_length"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Path found: [349355356.0, 3051041198.0, 3051043395.0, 8280086764.0, 61371318.0, 1038897344.0, 61371341.0, 61342109.0, 61372777.0, 61374245.0, 6462995309.0, 61340743.0, 61341751.0, 61343986.0, 61341770.0, 61353248.0, 7541401287.0, 61341786]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[61341786,\n",
       " 7541401287,\n",
       " 61353248,\n",
       " 61341770,\n",
       " 61343986,\n",
       " 61341751,\n",
       " 61340743,\n",
       " 6462995309,\n",
       " 61374245,\n",
       " 61372777,\n",
       " 61342109,\n",
       " 61371341,\n",
       " 1038897344,\n",
       " 61371318,\n",
       " 8280086764,\n",
       " 3051043395,\n",
       " 3051041198,\n",
       " 349355356]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Astar Algorithm\n",
    "\n",
    "g = Graph(nodes.shape[0], list(nodes.index))\n",
    "for t in NodesAndLength:\n",
    "    g.add_edge(t[0], t[1], t[2])\n",
    "    \n",
    "astar_path = g.a_star_algorithm(orig_node, dest_node, graph)\n",
    "astar_path.reverse()\n",
    "# Convert float to integer\n",
    "for i in range(0,len(astar_path)):\n",
    "    astar_path[i] = int(astar_path[i])\n",
    "astar_path"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Computer length of Astar's path\n",
    "\n",
    "astar_length = 0\n",
    "\n",
    "for i in range(len(astar_path)-1):\n",
    "    subEdge = (astar_path[i],astar_path[i+1])\n",
    "    astar_length += EdgeAndLength[subEdge]\n",
    "    \n",
    "astar_length = \"{:.2f}\".format(astar_length)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe srcdoc=\"&lt;!DOCTYPE html&gt;\n",
       "&lt;head&gt;    \n",
       "    &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;\n",
       "    \n",
       "        &lt;script&gt;\n",
       "            L_NO_TOUCH = false;\n",
       "            L_DISABLE_3D = false;\n",
       "        &lt;/script&gt;\n",
       "    \n",
       "    &lt;style&gt;html, body {width: 100%;height: 100%;margin: 0;padding: 0;}&lt;/style&gt;\n",
       "    &lt;style&gt;#map {position:absolute;top:0;bottom:0;right:0;left:0;}&lt;/style&gt;\n",
       "    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.6.0/dist/leaflet.js&quot;&gt;&lt;/script&gt;\n",
       "    &lt;script src=&quot;https://code.jquery.com/jquery-1.12.4.min.js&quot;&gt;&lt;/script&gt;\n",
       "    &lt;script src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js&quot;&gt;&lt;/script&gt;\n",
       "    &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.js&quot;&gt;&lt;/script&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.6.0/dist/leaflet.css&quot;/&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css&quot;/&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css&quot;/&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css&quot;/&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css&quot;/&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/gh/python-visualization/folium/folium/templates/leaflet.awesome.rotate.min.css&quot;/&gt;\n",
       "    \n",
       "            &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,\n",
       "                initial-scale=1.0, maximum-scale=1.0, user-scalable=no&quot; /&gt;\n",
       "            &lt;style&gt;\n",
       "                #map_cde7562566fbfc93e42c943e89f7588e {\n",
       "                    position: relative;\n",
       "                    width: 100.0%;\n",
       "                    height: 100.0%;\n",
       "                    left: 0.0%;\n",
       "                    top: 0.0%;\n",
       "                }\n",
       "            &lt;/style&gt;\n",
       "        \n",
       "&lt;/head&gt;\n",
       "&lt;body&gt;    \n",
       "    \n",
       "                &lt;h3 align=&quot;center&quot; style=&quot;font-size:16px&quot;&gt;&lt;b&gt;Shortest path calculated with Dijkstra algorithm - Total distance = 1548.64 meters&lt;/b&gt;&lt;/h3&gt;\n",
       "                \n",
       "    \n",
       "            &lt;div class=&quot;folium-map&quot; id=&quot;map_cde7562566fbfc93e42c943e89f7588e&quot; &gt;&lt;/div&gt;\n",
       "        \n",
       "&lt;/body&gt;\n",
       "&lt;script&gt;    \n",
       "    \n",
       "            var map_cde7562566fbfc93e42c943e89f7588e = L.map(\n",
       "                &quot;map_cde7562566fbfc93e42c943e89f7588e&quot;,\n",
       "                {\n",
       "                    center: [42.35077657032977, -71.0769599196711],\n",
       "                    crs: L.CRS.EPSG3857,\n",
       "                    zoom: 1,\n",
       "                    zoomControl: true,\n",
       "                    preferCanvas: false,\n",
       "                }\n",
       "            );\n",
       "\n",
       "            \n",
       "\n",
       "        \n",
       "    \n",
       "            var tile_layer_2b6c1192c4eb93f111fb4b73f4336266 = L.tileLayer(\n",
       "                &quot;https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png&quot;,\n",
       "                {&quot;attribution&quot;: &quot;\\u0026copy; \\u003ca href=\\&quot;http://www.openstreetmap.org/copyright\\&quot;\\u003eOpenStreetMap\\u003c/a\\u003e contributors \\u0026copy; \\u003ca href=\\&quot;http://cartodb.com/attributions\\&quot;\\u003eCartoDB\\u003c/a\\u003e, CartoDB \\u003ca href =\\&quot;http://cartodb.com/attributions\\&quot;\\u003eattributions\\u003c/a\\u003e&quot;, &quot;detectRetina&quot;: false, &quot;maxNativeZoom&quot;: 18, &quot;maxZoom&quot;: 18, &quot;minZoom&quot;: 0, &quot;noWrap&quot;: false, &quot;opacity&quot;: 1, &quot;subdomains&quot;: &quot;abc&quot;, &quot;tms&quot;: false}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "            var poly_line_657adcb05eed5f672a05d6399f384286 = L.polyline(\n",
       "                [[42.3540267, -71.0744118], [42.3540887, -71.0744431], [42.3544154, -71.0746033], [42.3547166, -71.0747473], [42.3547405, -71.0747585], [42.3548037, -71.0747905]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_8c3ccd2db31485cfe784170603864461 = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_589c6c886ea353eb0560f219e732e490 = $(`&lt;div id=&quot;html_589c6c886ea353eb0560f219e732e490&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;91.833&lt;/div&gt;`)[0];\n",
       "            popup_8c3ccd2db31485cfe784170603864461.setContent(html_589c6c886ea353eb0560f219e732e490);\n",
       "        \n",
       "\n",
       "        poly_line_657adcb05eed5f672a05d6399f384286.bindPopup(popup_8c3ccd2db31485cfe784170603864461)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var poly_line_5aa4fb98a97a65611b96a628fd2064fb = L.polyline(\n",
       "                [[42.3548037, -71.0747905], [42.3547852, -71.074867], [42.354529, -71.075816], [42.3543149, -71.0766091], [42.354251, -71.0768458], [42.3542434, -71.0768732], [42.354224, -71.0769453]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_4fd88bb3e2bc97ccd62c3c3fbd9a52e9 = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_c63dab3746b2eef8f6ee8542d83d2ff6 = $(`&lt;div id=&quot;html_c63dab3746b2eef8f6ee8542d83d2ff6&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;188.436&lt;/div&gt;`)[0];\n",
       "            popup_4fd88bb3e2bc97ccd62c3c3fbd9a52e9.setContent(html_c63dab3746b2eef8f6ee8542d83d2ff6);\n",
       "        \n",
       "\n",
       "        poly_line_5aa4fb98a97a65611b96a628fd2064fb.bindPopup(popup_4fd88bb3e2bc97ccd62c3c3fbd9a52e9)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var poly_line_2fcd188d866cc10e88cf2f1874124bff = L.polyline(\n",
       "                [[42.354224, -71.0769453], [42.3541616, -71.0769137], [42.3538353, -71.0767588], [42.3535312, -71.07661], [42.3535075, -71.0765995], [42.3534421, -71.0765683]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_5bd5e280736432177d315d215c20b33a = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_6151e05a3cb3130688276fdf8506299f = $(`&lt;div id=&quot;html_6151e05a3cb3130688276fdf8506299f&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;92.301&lt;/div&gt;`)[0];\n",
       "            popup_5bd5e280736432177d315d215c20b33a.setContent(html_6151e05a3cb3130688276fdf8506299f);\n",
       "        \n",
       "\n",
       "        poly_line_2fcd188d866cc10e88cf2f1874124bff.bindPopup(popup_5bd5e280736432177d315d215c20b33a)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var poly_line_0460b859a2470ed08e2692b7dc40c05c = L.polyline(\n",
       "                [[42.3534421, -71.0765683], [42.3533836, -71.0765382], [42.3530621, -71.0763763], [42.3527212, -71.0762106], [42.3526965, -71.0761983], [42.3526346, -71.0761697]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_b357e256ce6a281e434b989a54cbc396 = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_d90aea78a9c65c3d7f58403a8da3c7cc = $(`&lt;div id=&quot;html_d90aea78a9c65c3d7f58403a8da3c7cc&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;95.581&lt;/div&gt;`)[0];\n",
       "            popup_b357e256ce6a281e434b989a54cbc396.setContent(html_d90aea78a9c65c3d7f58403a8da3c7cc);\n",
       "        \n",
       "\n",
       "        poly_line_0460b859a2470ed08e2692b7dc40c05c.bindPopup(popup_b357e256ce6a281e434b989a54cbc396)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var poly_line_4b1512abfbc8ee48a887a58c327b664f = L.polyline(\n",
       "                [[42.3526346, -71.0761697], [42.3525993, -71.0761522], [42.3525759, -71.0761406], [42.3524633, -71.076086], [42.3523722, -71.0760407], [42.3523459, -71.0760278], [42.3523247, -71.0760174], [42.3522852, -71.0759979]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_0f7ea9cda6401dcebaaccdcaaae05748 = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_faeea64d13ae3652c66cee9d9621f308 = $(`&lt;div id=&quot;html_faeea64d13ae3652c66cee9d9621f308&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;41.33599999999999&lt;/div&gt;`)[0];\n",
       "            popup_0f7ea9cda6401dcebaaccdcaaae05748.setContent(html_faeea64d13ae3652c66cee9d9621f308);\n",
       "        \n",
       "\n",
       "        poly_line_4b1512abfbc8ee48a887a58c327b664f.bindPopup(popup_0f7ea9cda6401dcebaaccdcaaae05748)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var poly_line_34deca4fa17550fa588d1b84083d8611 = L.polyline(\n",
       "                [[42.3522852, -71.0759979], [42.3522274, -71.0759695], [42.3518656, -71.0757905], [42.351823, -71.0757688], [42.3515692, -71.0756445], [42.3515407, -71.0756305], [42.3514778, -71.0755997]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_781a222305f57f3511cf1f6435a8a8fe = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_78a5b6c4dda2b6e09d5e1263e4bcb5d5 = $(`&lt;div id=&quot;html_78a5b6c4dda2b6e09d5e1263e4bcb5d5&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;95.556&lt;/div&gt;`)[0];\n",
       "            popup_781a222305f57f3511cf1f6435a8a8fe.setContent(html_78a5b6c4dda2b6e09d5e1263e4bcb5d5);\n",
       "        \n",
       "\n",
       "        poly_line_34deca4fa17550fa588d1b84083d8611.bindPopup(popup_781a222305f57f3511cf1f6435a8a8fe)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var poly_line_5e8de4c882fd85d9ac8c7c11dac92b7f = L.polyline(\n",
       "                [[42.3514778, -71.0755997], [42.3514109, -71.0755667], [42.3510829, -71.0754053], [42.3507877, -71.0752606], [42.3507665, -71.0752496], [42.3506693, -71.0752018]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_efd99691510b92737acda5c8d9f9f531 = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_52db6df87fc5b9974e40db38e6656e44 = $(`&lt;div id=&quot;html_52db6df87fc5b9974e40db38e6656e44&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;95.664&lt;/div&gt;`)[0];\n",
       "            popup_efd99691510b92737acda5c8d9f9f531.setContent(html_52db6df87fc5b9974e40db38e6656e44);\n",
       "        \n",
       "\n",
       "        poly_line_5e8de4c882fd85d9ac8c7c11dac92b7f.bindPopup(popup_efd99691510b92737acda5c8d9f9f531)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var poly_line_b887622fdff8229e1714bcf9019ccb8f = L.polyline(\n",
       "                [[42.3506693, -71.0752018], [42.3505868, -71.0751669], [42.3501231, -71.0749391], [42.3499578, -71.0748579], [42.3499304, -71.0748444], [42.349859, -71.0748082]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_5fec11a7ebac44168a4d66fee048f61c = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_d66a09829df53cacc1f2aeecd63c9b1f = $(`&lt;div id=&quot;html_d66a09829df53cacc1f2aeecd63c9b1f&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;95.739&lt;/div&gt;`)[0];\n",
       "            popup_5fec11a7ebac44168a4d66fee048f61c.setContent(html_d66a09829df53cacc1f2aeecd63c9b1f);\n",
       "        \n",
       "\n",
       "        poly_line_b887622fdff8229e1714bcf9019ccb8f.bindPopup(popup_5fec11a7ebac44168a4d66fee048f61c)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var poly_line_0c2d25fb32ccfea7e8464adf90a9b16c = L.polyline(\n",
       "                [[42.349859, -71.0748082], [42.3498346, -71.0748962], [42.349644, -71.0756182], [42.3496303, -71.0756818], [42.3496156, -71.0757561], [42.3496074, -71.0758038], [42.3495972, -71.0758712]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_f4a16b455e4510b0b0cc34bc86e8ac23 = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_b7c9a2616f65015cb47797dbbc14af07 = $(`&lt;div id=&quot;html_b7c9a2616f65015cb47797dbbc14af07&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;92.172&lt;/div&gt;`)[0];\n",
       "            popup_f4a16b455e4510b0b0cc34bc86e8ac23.setContent(html_b7c9a2616f65015cb47797dbbc14af07);\n",
       "        \n",
       "\n",
       "        poly_line_0c2d25fb32ccfea7e8464adf90a9b16c.bindPopup(popup_f4a16b455e4510b0b0cc34bc86e8ac23)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var poly_line_43b8de6f5f55819872dc2a667400c084 = L.polyline(\n",
       "                [[42.3495972, -71.0758712], [42.3495869, -71.075956], [42.3495784, -71.0760142], [42.349567, -71.0760781], [42.3495373, -71.0762207], [42.3495027, -71.076362], [42.3494819, -71.076435], [42.349453, -71.0765292], [42.3494245, -71.0766132], [42.3493958, -71.0766901], [42.3493642, -71.0767681], [42.3493514, -71.0767953], [42.3493351, -71.0768257], [42.3493193, -71.0768518], [42.3493005, -71.0768792], [42.3492809, -71.0769062], [42.3492626, -71.076931]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_062c5d3aa242bd00f554e79de74ccf1f = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_4b2563d45b51a51168d8a29f4fce0bc8 = $(`&lt;div id=&quot;html_4b2563d45b51a51168d8a29f4fce0bc8&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;96.115&lt;/div&gt;`)[0];\n",
       "            popup_062c5d3aa242bd00f554e79de74ccf1f.setContent(html_4b2563d45b51a51168d8a29f4fce0bc8);\n",
       "        \n",
       "\n",
       "        poly_line_43b8de6f5f55819872dc2a667400c084.bindPopup(popup_062c5d3aa242bd00f554e79de74ccf1f)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var poly_line_699871f8ab2fb544038ae53fb7e43c80 = L.polyline(\n",
       "                [[42.3492626, -71.076931], [42.3492269, -71.076977], [42.3491836, -71.0770291], [42.349076, -71.0771481]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_684a26fc53a147646d0ce3f0ca64bfe0 = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_0777da6eeff33d176d16edc59951dd88 = $(`&lt;div id=&quot;html_0777da6eeff33d176d16edc59951dd88&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;27.378&lt;/div&gt;`)[0];\n",
       "            popup_684a26fc53a147646d0ce3f0ca64bfe0.setContent(html_0777da6eeff33d176d16edc59951dd88);\n",
       "        \n",
       "\n",
       "        poly_line_699871f8ab2fb544038ae53fb7e43c80.bindPopup(popup_684a26fc53a147646d0ce3f0ca64bfe0)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var poly_line_9156ec2c0d1ac8e5ca31a5abc6d7b799 = L.polyline(\n",
       "                [[42.349076, -71.0771481], [42.3490096, -71.0772228], [42.3489485, -71.077294], [42.3487408, -71.0775485], [42.3482977, -71.0780852], [42.3481833, -71.0782207]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_af0b828a5cb2cec7a2fa8a184f113674 = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_94f72c65fa6d57e1c24554f851d3a0d7 = $(`&lt;div id=&quot;html_94f72c65fa6d57e1c24554f851d3a0d7&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;132.76&lt;/div&gt;`)[0];\n",
       "            popup_af0b828a5cb2cec7a2fa8a184f113674.setContent(html_94f72c65fa6d57e1c24554f851d3a0d7);\n",
       "        \n",
       "\n",
       "        poly_line_9156ec2c0d1ac8e5ca31a5abc6d7b799.bindPopup(popup_af0b828a5cb2cec7a2fa8a184f113674)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var poly_line_f39bec86658da6cd3e5a6e7b8b166867 = L.polyline(\n",
       "                [[42.3481833, -71.0782207], [42.3481339, -71.0782792], [42.3481109, -71.0783083], [42.3480911, -71.0783362], [42.3479778, -71.0785046], [42.3479573, -71.0785349], [42.347854, -71.0786907]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_fd5aa39253b705871e522b4097cc919c = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_1808dfb4b0ac23aa19aaee1931cbf98d = $(`&lt;div id=&quot;html_1808dfb4b0ac23aa19aaee1931cbf98d&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;53.272&lt;/div&gt;`)[0];\n",
       "            popup_fd5aa39253b705871e522b4097cc919c.setContent(html_1808dfb4b0ac23aa19aaee1931cbf98d);\n",
       "        \n",
       "\n",
       "        poly_line_f39bec86658da6cd3e5a6e7b8b166867.bindPopup(popup_fd5aa39253b705871e522b4097cc919c)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var poly_line_917cfda742df832fd0677b2dd51b9119 = L.polyline(\n",
       "                [[42.347854, -71.0786907], [42.3477732, -71.0788123], [42.3477348, -71.0788661], [42.3476902, -71.0789227], [42.3476095, -71.0790212]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_133babff68e665a75f0fb06427ee891a = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_83ad65310761caae247d8d89cd67af96 = $(`&lt;div id=&quot;html_83ad65310761caae247d8d89cd67af96&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;38.469&lt;/div&gt;`)[0];\n",
       "            popup_133babff68e665a75f0fb06427ee891a.setContent(html_83ad65310761caae247d8d89cd67af96);\n",
       "        \n",
       "\n",
       "        poly_line_917cfda742df832fd0677b2dd51b9119.bindPopup(popup_133babff68e665a75f0fb06427ee891a)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var poly_line_ab28738f805fe73523a1c4575baaf1ed = L.polyline(\n",
       "                [[42.3476095, -71.0790212], [42.3472714, -71.0794297]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_dcb3c1eb8f4e2940d0e6b39794526a92 = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_71404092b64d466ea23153cfb9ffa7a6 = $(`&lt;div id=&quot;html_71404092b64d466ea23153cfb9ffa7a6&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;50.402&lt;/div&gt;`)[0];\n",
       "            popup_dcb3c1eb8f4e2940d0e6b39794526a92.setContent(html_71404092b64d466ea23153cfb9ffa7a6);\n",
       "        \n",
       "\n",
       "        poly_line_ab28738f805fe73523a1c4575baaf1ed.bindPopup(popup_dcb3c1eb8f4e2940d0e6b39794526a92)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var poly_line_5af5004b376dae651071f5386da5948c = L.polyline(\n",
       "                [[42.3472714, -71.0794297], [42.3472494, -71.0794825], [42.3472393, -71.079516], [42.3472278, -71.079567], [42.3472211, -71.0796036], [42.3472164, -71.0796434], [42.3472148, -71.0796752], [42.3472168, -71.0797069], [42.3472214, -71.0797381], [42.3472292, -71.0797688], [42.34724, -71.0797975], [42.3472521, -71.0798185], [42.3472667, -71.0798372]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_e38c75addb44f3fbfa0db6046d19f503 = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_10c739329187c1536a08e704effbcc0b = $(`&lt;div id=&quot;html_10c739329187c1536a08e704effbcc0b&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;36.334&lt;/div&gt;`)[0];\n",
       "            popup_e38c75addb44f3fbfa0db6046d19f503.setContent(html_10c739329187c1536a08e704effbcc0b);\n",
       "        \n",
       "\n",
       "        poly_line_5af5004b376dae651071f5386da5948c.bindPopup(popup_e38c75addb44f3fbfa0db6046d19f503)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var poly_line_c7596d0d09d01499e97632c80c882780 = L.polyline(\n",
       "                [[42.3472667, -71.0798372], [42.3480327, -71.0802235], [42.3481641, -71.0802866], [42.3484767, -71.0804346], [42.3487939, -71.0805902], [42.3490577, -71.0807197], [42.3490847, -71.0807329], [42.3491705, -71.080775]],\n",
       "                {&quot;bubblingMouseEvents&quot;: true, &quot;color&quot;: &quot;lightblue&quot;, &quot;dashArray&quot;: null, &quot;dashOffset&quot;: null, &quot;fill&quot;: false, &quot;fillColor&quot;: &quot;lightblue&quot;, &quot;fillOpacity&quot;: 0.2, &quot;fillRule&quot;: &quot;evenodd&quot;, &quot;lineCap&quot;: &quot;round&quot;, &quot;lineJoin&quot;: &quot;round&quot;, &quot;noClip&quot;: false, &quot;opacity&quot;: 1.0, &quot;smoothFactor&quot;: 1.0, &quot;stroke&quot;: true, &quot;weight&quot;: 10}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "        var popup_3dc14d9fe56c558cb768676084d211e6 = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_57dbaf4ecbcef0128ee04e24ceda1591 = $(`&lt;div id=&quot;html_57dbaf4ecbcef0128ee04e24ceda1591&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;225.29000000000002&lt;/div&gt;`)[0];\n",
       "            popup_3dc14d9fe56c558cb768676084d211e6.setContent(html_57dbaf4ecbcef0128ee04e24ceda1591);\n",
       "        \n",
       "\n",
       "        poly_line_c7596d0d09d01499e97632c80c882780.bindPopup(popup_3dc14d9fe56c558cb768676084d211e6)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            map_cde7562566fbfc93e42c943e89f7588e.fitBounds(\n",
       "                [[42.3472148, -71.080775], [42.3548037, -71.0744118]],\n",
       "                {}\n",
       "            );\n",
       "        \n",
       "    \n",
       "            var tile_layer_6d50efd700abf8a4aa64ede0cdde831e = L.tileLayer(\n",
       "                &quot;https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png&quot;,\n",
       "                {&quot;attribution&quot;: &quot;Data by \\u0026copy; \\u003ca href=\\&quot;http://openstreetmap.org\\&quot;\\u003eOpenStreetMap\\u003c/a\\u003e, under \\u003ca href=\\&quot;http://www.openstreetmap.org/copyright\\&quot;\\u003eODbL\\u003c/a\\u003e.&quot;, &quot;detectRetina&quot;: false, &quot;maxNativeZoom&quot;: 18, &quot;maxZoom&quot;: 18, &quot;minZoom&quot;: 0, &quot;noWrap&quot;: false, &quot;opacity&quot;: 1, &quot;subdomains&quot;: &quot;abc&quot;, &quot;tms&quot;: false}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "            var tile_layer_09fec107a83c1024a35720a00a634a6e = L.tileLayer(\n",
       "                &quot;https://stamen-tiles-{s}.a.ssl.fastly.net/terrain/{z}/{x}/{y}.jpg&quot;,\n",
       "                {&quot;attribution&quot;: &quot;Map tiles by \\u003ca href=\\&quot;http://stamen.com\\&quot;\\u003eStamen Design\\u003c/a\\u003e, under \\u003ca href=\\&quot;http://creativecommons.org/licenses/by/3.0\\&quot;\\u003eCC BY 3.0\\u003c/a\\u003e. Data by \\u0026copy; \\u003ca href=\\&quot;http://openstreetmap.org\\&quot;\\u003eOpenStreetMap\\u003c/a\\u003e, under \\u003ca href=\\&quot;http://creativecommons.org/licenses/by-sa/3.0\\&quot;\\u003eCC BY SA\\u003c/a\\u003e.&quot;, &quot;detectRetina&quot;: false, &quot;maxNativeZoom&quot;: 18, &quot;maxZoom&quot;: 18, &quot;minZoom&quot;: 0, &quot;noWrap&quot;: false, &quot;opacity&quot;: 1, &quot;subdomains&quot;: &quot;abc&quot;, &quot;tms&quot;: false}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "            var tile_layer_56bfd220c953f3784bf100ff9e26aee9 = L.tileLayer(\n",
       "                &quot;https://stamen-tiles-{s}.a.ssl.fastly.net/toner/{z}/{x}/{y}.png&quot;,\n",
       "                {&quot;attribution&quot;: &quot;Map tiles by \\u003ca href=\\&quot;http://stamen.com\\&quot;\\u003eStamen Design\\u003c/a\\u003e, under \\u003ca href=\\&quot;http://creativecommons.org/licenses/by/3.0\\&quot;\\u003eCC BY 3.0\\u003c/a\\u003e. Data by \\u0026copy; \\u003ca href=\\&quot;http://openstreetmap.org\\&quot;\\u003eOpenStreetMap\\u003c/a\\u003e, under \\u003ca href=\\&quot;http://www.openstreetmap.org/copyright\\&quot;\\u003eODbL\\u003c/a\\u003e.&quot;, &quot;detectRetina&quot;: false, &quot;maxNativeZoom&quot;: 18, &quot;maxZoom&quot;: 18, &quot;minZoom&quot;: 0, &quot;noWrap&quot;: false, &quot;opacity&quot;: 1, &quot;subdomains&quot;: &quot;abc&quot;, &quot;tms&quot;: false}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "            var tile_layer_4e97056f63658489bd0b461c5ed5594b = L.tileLayer(\n",
       "                &quot;https://stamen-tiles-{s}.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.jpg&quot;,\n",
       "                {&quot;attribution&quot;: &quot;Map tiles by \\u003ca href=\\&quot;http://stamen.com\\&quot;\\u003eStamen Design\\u003c/a\\u003e, under \\u003ca href=\\&quot;http://creativecommons.org/licenses/by/3.0\\&quot;\\u003eCC BY 3.0\\u003c/a\\u003e. Data by \\u0026copy; \\u003ca href=\\&quot;http://openstreetmap.org\\&quot;\\u003eOpenStreetMap\\u003c/a\\u003e, under \\u003ca href=\\&quot;http://creativecommons.org/licenses/by-sa/3.0\\&quot;\\u003eCC BY SA\\u003c/a\\u003e.&quot;, &quot;detectRetina&quot;: false, &quot;maxNativeZoom&quot;: 18, &quot;maxZoom&quot;: 18, &quot;minZoom&quot;: 0, &quot;noWrap&quot;: false, &quot;opacity&quot;: 1, &quot;subdomains&quot;: &quot;abc&quot;, &quot;tms&quot;: false}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "            var tile_layer_e3da3cee4732f8f9469f3d87daaea09b = L.tileLayer(\n",
       "                &quot;https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png&quot;,\n",
       "                {&quot;attribution&quot;: &quot;\\u0026copy; \\u003ca href=\\&quot;http://www.openstreetmap.org/copyright\\&quot;\\u003eOpenStreetMap\\u003c/a\\u003e contributors \\u0026copy; \\u003ca href=\\&quot;http://cartodb.com/attributions\\&quot;\\u003eCartoDB\\u003c/a\\u003e, CartoDB \\u003ca href =\\&quot;http://cartodb.com/attributions\\&quot;\\u003eattributions\\u003c/a\\u003e&quot;, &quot;detectRetina&quot;: false, &quot;maxNativeZoom&quot;: 18, &quot;maxZoom&quot;: 18, &quot;minZoom&quot;: 0, &quot;noWrap&quot;: false, &quot;opacity&quot;: 1, &quot;subdomains&quot;: &quot;abc&quot;, &quot;tms&quot;: false}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "            var tile_layer_8596d66f5951e90a86b76950be9161b4 = L.tileLayer(\n",
       "                &quot;https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png&quot;,\n",
       "                {&quot;attribution&quot;: &quot;\\u0026copy; \\u003ca href=\\&quot;http://www.openstreetmap.org/copyright\\&quot;\\u003eOpenStreetMap\\u003c/a\\u003e contributors \\u0026copy; \\u003ca href=\\&quot;http://cartodb.com/attributions\\&quot;\\u003eCartoDB\\u003c/a\\u003e, CartoDB \\u003ca href =\\&quot;http://cartodb.com/attributions\\&quot;\\u003eattributions\\u003c/a\\u003e&quot;, &quot;detectRetina&quot;: false, &quot;maxNativeZoom&quot;: 18, &quot;maxZoom&quot;: 18, &quot;minZoom&quot;: 0, &quot;noWrap&quot;: false, &quot;opacity&quot;: 1, &quot;subdomains&quot;: &quot;abc&quot;, &quot;tms&quot;: false}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "            var layer_control_c7d09e2d18b18d3e7869d709af716f1c = {\n",
       "                base_layers : {\n",
       "                    &quot;cartodbpositron&quot; : tile_layer_e3da3cee4732f8f9469f3d87daaea09b,\n",
       "                    &quot;openstreetmap&quot; : tile_layer_6d50efd700abf8a4aa64ede0cdde831e,\n",
       "                    &quot;stamenterrain&quot; : tile_layer_09fec107a83c1024a35720a00a634a6e,\n",
       "                    &quot;stamentoner&quot; : tile_layer_56bfd220c953f3784bf100ff9e26aee9,\n",
       "                    &quot;stamenwatercolor&quot; : tile_layer_4e97056f63658489bd0b461c5ed5594b,\n",
       "                    &quot;cartodbdark_matter&quot; : tile_layer_8596d66f5951e90a86b76950be9161b4,\n",
       "                },\n",
       "                overlays :  {\n",
       "                },\n",
       "            };\n",
       "            L.control.layers(\n",
       "                layer_control_c7d09e2d18b18d3e7869d709af716f1c.base_layers,\n",
       "                layer_control_c7d09e2d18b18d3e7869d709af716f1c.overlays,\n",
       "                {&quot;autoZIndex&quot;: true, &quot;collapsed&quot;: true, &quot;position&quot;: &quot;topright&quot;}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "            tile_layer_6d50efd700abf8a4aa64ede0cdde831e.remove();\n",
       "            tile_layer_09fec107a83c1024a35720a00a634a6e.remove();\n",
       "            tile_layer_56bfd220c953f3784bf100ff9e26aee9.remove();\n",
       "            tile_layer_4e97056f63658489bd0b461c5ed5594b.remove();\n",
       "            tile_layer_e3da3cee4732f8f9469f3d87daaea09b.remove();\n",
       "            tile_layer_8596d66f5951e90a86b76950be9161b4.remove();\n",
       "        \n",
       "    \n",
       "            var marker_94d4adc2a235ff17ab6d15a1c59d35fc = L.marker(\n",
       "                [42.353670300000005, -71.07475378063705],\n",
       "                {}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "            var icon_cb863efa573640b93f0253a21ef7a825 = L.AwesomeMarkers.icon(\n",
       "                {&quot;extraClasses&quot;: &quot;fa-rotate-0&quot;, &quot;icon&quot;: &quot;info-sign&quot;, &quot;iconColor&quot;: &quot;white&quot;, &quot;markerColor&quot;: &quot;black&quot;, &quot;prefix&quot;: &quot;glyphicon&quot;}\n",
       "            );\n",
       "            marker_94d4adc2a235ff17ab6d15a1c59d35fc.setIcon(icon_cb863efa573640b93f0253a21ef7a825);\n",
       "        \n",
       "    \n",
       "        var popup_613f75d9bf9215fe0a730e369a09aab8 = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_624887a1736f2b2d9a28898c51d73fc1 = $(`&lt;div id=&quot;html_624887a1736f2b2d9a28898c51d73fc1&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;Departure&lt;/div&gt;`)[0];\n",
       "            popup_613f75d9bf9215fe0a730e369a09aab8.setContent(html_624887a1736f2b2d9a28898c51d73fc1);\n",
       "        \n",
       "\n",
       "        marker_94d4adc2a235ff17ab6d15a1c59d35fc.bindPopup(popup_613f75d9bf9215fe0a730e369a09aab8)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "    \n",
       "            var marker_7fc2ce9c818953a0365663a82cc9ca46 = L.marker(\n",
       "                [42.3492931, -71.0811812],\n",
       "                {}\n",
       "            ).addTo(map_cde7562566fbfc93e42c943e89f7588e);\n",
       "        \n",
       "    \n",
       "            var icon_695dcc3dc1b78f2d462e17ff8b243bbd = L.AwesomeMarkers.icon(\n",
       "                {&quot;extraClasses&quot;: &quot;fa-rotate-0&quot;, &quot;icon&quot;: &quot;info-sign&quot;, &quot;iconColor&quot;: &quot;white&quot;, &quot;markerColor&quot;: &quot;green&quot;, &quot;prefix&quot;: &quot;glyphicon&quot;}\n",
       "            );\n",
       "            marker_7fc2ce9c818953a0365663a82cc9ca46.setIcon(icon_695dcc3dc1b78f2d462e17ff8b243bbd);\n",
       "        \n",
       "    \n",
       "        var popup_3502c81e6ee6016e9b80bea9ff652794 = L.popup({&quot;maxWidth&quot;: &quot;100%&quot;});\n",
       "\n",
       "        \n",
       "            var html_b743a995a974db39aa48d82b2d60f22a = $(`&lt;div id=&quot;html_b743a995a974db39aa48d82b2d60f22a&quot; style=&quot;width: 100.0%; height: 100.0%;&quot;&gt;Destination&lt;/div&gt;`)[0];\n",
       "            popup_3502c81e6ee6016e9b80bea9ff652794.setContent(html_b743a995a974db39aa48d82b2d60f22a);\n",
       "        \n",
       "\n",
       "        marker_7fc2ce9c818953a0365663a82cc9ca46.bindPopup(popup_3502c81e6ee6016e9b80bea9ff652794)\n",
       "        ;\n",
       "\n",
       "        \n",
       "    \n",
       "&lt;/script&gt;\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7fb2a07e46a0>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Plot the shortest route on Openstreet Map\n",
    "\n",
    "dijkstra_map = ox.plot_route_folium(graph, dij_path, popup_attribute=\"length\", weight=10, color='lightblue')\n",
    "bellman_map = ox.plot_route_folium(graph, bell_path, popup_attribute=\"length\", weight=10, color='purple')\n",
    "astar_map = ox.plot_route_folium(graph, astar_path, popup_attribute=\"length\", weight=10, color='grey')\n",
    "\n",
    "maps = [dijkstra_map,bellman_map,astar_map]\n",
    "\n",
    "for i in maps:\n",
    "    folium.TileLayer('openstreetmap').add_to(i)\n",
    "    folium.TileLayer('Stamen Terrain').add_to(i)\n",
    "    folium.TileLayer('Stamen Toner').add_to(i)\n",
    "    folium.TileLayer('Stamen Water Color').add_to(i)\n",
    "    folium.TileLayer('cartodbpositron').add_to(i)\n",
    "    folium.TileLayer('cartodbdark_matter').add_to(i)\n",
    "    folium.LayerControl().add_to(i)\n",
    "\n",
    "    # Marker class only accepts coordinates in tuple form\n",
    "    start_marker = folium.Marker(\n",
    "                location = (start_lat,start_long),\n",
    "                popup = \"Departure\",\n",
    "                icon = folium.Icon(color='black'))\n",
    "    end_marker = folium.Marker(\n",
    "                location = (end_lat,end_long),\n",
    "                popup = \"Destination\",\n",
    "                icon = folium.Icon(color='green'))\n",
    "    # add the circle marker to the map\n",
    "    start_marker.add_to(i)\n",
    "    end_marker.add_to(i)\n",
    "\n",
    "mapNames = [\"Dijkstra\",\"Bellman-Ford\",\"A*\"]\n",
    "pathLengths = [dij_length,bell_length,astar_length]\n",
    "\n",
    "for i in range(len(mapNames)):\n",
    "    # Add title\n",
    "    text = \"Shortest path calculated with \"+mapNames[i]+\" algorithm - Total distance = \"+str(pathLengths[i])+\" meters\"\n",
    "    title_html = '''\n",
    "                <h3 align=\"center\" style=\"font-size:16px\"><b>{}</b></h3>\n",
    "                '''.format(text)  \n",
    "    maps[i].get_root().html.add_child(folium.Element(title_html))\n",
    "\n",
    "dijkstra_map"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "=========================\n",
      "Maps with plotted shortest path are stored in current folder, please open it with your browswer to view the path :)\n",
      "=== Program finished ===\n"
     ]
    }
   ],
   "source": [
    "# Save the output map as html file\n",
    "dijkstra_map.save(\"./dijkstra_map.html\")\n",
    "bellman_map.save(\"./bellman_map.html\")\n",
    "astar_map.save(\"./astar_map.html\")\n",
    "\n",
    "print(\"\\n=========================\\nMaps with plotted shortest path are stored in current folder, please open it with your browswer to view the path :)\\n=== Program finished ===\")"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "6527a1c360c7c1de9adbf312610ad1086bba16ede739b8e7de3fe8f03d90a0bd"
  },
  "kernelspec": {
   "display_name": "Python 3.10.4 64-bit",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
